如何使用spring初始化,加载属性和设置我自己的连接池? [英] How to initialise,load properties and dispose my own connection pool using spring?
问题描述
我有自己的连接池:
public final class ConnectionPool {
private static final Logger log = Logger.getLogger(ConnectionPool.class);
private static final int DEFAULT_POOL_SIZE = 10;
//single instance
private static ConnectionPool instance;
//queue of free connections
private BlockingQueue<Connection> connectionQueue;
public ConnectionPool(String driver, String url, String user,
String password, int poolSize)
throws ClassNotFoundException, DAOException{
try{
Class.forName(driver);
connectionQueue = new ArrayBlockingQueue<Connection>(poolSize);
for(int i = 0; i < poolSize ;i++){
Connection connection = DriverManager.getConnection(url, user, password);
connectionQueue.offer(connection);
}
}
catch (SQLException e) {
log.error(e);
throw new DAOException(e.getMessage());
}
}
public static void init() throws DAOException{
try {
if(instance == null){
String driver = ConfigurationManager.
getInstance().getProperty(ConfigurationManager.DATABASE_DRIVER_NAME);
String url = ConfigurationManager.
getInstance().getProperty(ConfigurationManager.DATABASE_URL);
String user = ConfigurationManager.
getInstance().getProperty(ConfigurationManager.DATABASE_USER);
String password = ConfigurationManager.
getInstance().getProperty(ConfigurationManager.DATABASE_PASSWORD);
String poolSizeStr = ConfigurationManager.
getInstance().getProperty(ConfigurationManager.DATABASE_POOLSIZE);
int poolSize = (poolSizeStr != null) ?
Integer.parseInt(poolSizeStr) : DEFAULT_POOL_SIZE;
log.info("Trying to create pool of connections...");
instance = new ConnectionPool(driver,url,user,password,poolSize);
log.info("Connection pool initialized");
}
}catch (ClassNotFoundException e) {
log.error(e);
} catch (SQLException e) {
log.error(e);
throw new DAOException(e.getMessage());
}
}
public static void dispose() throws DAOException {
try {
if(instance != null){
instance.clearConnectionQueue();
instance = null;
log.info("Connection queue is disposed");
}
} catch (DAOException e) {
log.info(e.getMessage());
throw new DAOException(e.getMessage());
}
}
public static ConnectionPool getInstance(){
return instance;
}
public Connection takeConnection() {
Connection connection = null;
try{
connection = connectionQueue.take();
}catch (InterruptedException e) {
log.info("Free connection waiting interrupted.Returned null connection");
log.error(e);
}
return connection;
}
public static void releaseConnection(Connection connection) throws DAOException {
try {
if(!connection.isClosed()){
if(!getInstance().connectionQueue.offer(connection)){
log.info("Connections is not added.");
}
}
else{
log.info("Trying to release closed connection.");
}
} catch (SQLException e) {
log.info("SQLException at connection isClosed(). Connection is not added");
throw new DAOException(e.getMessage());
}
}
private void clearConnectionQueue() throws DAOException{
try {
Connection connection;
while((connection = connectionQueue.poll()) != null){
if(!connection.getAutoCommit()){
connection.commit();
connection.close();
}
}
} catch (SQLException e) {
log.info(e.getMessage());
throw new DAOException(e.getMessage());
}
}
}
现在我将使用与ResourceBundle
连接的我自己的类ConfigurationManager
来初始化并使用侦听器和负载属性销毁它:
And I now I'm initialise and destroy it with listener and load properties using my own class ConfigurationManager
,connected with ResourceBundle
:
public final class ConfigurationManager {
private static ConfigurationManager instance;
private ResourceBundle resourceBundle;
//getting info from config.properties
private static final String BUNDLE_NAME = "config";
public static final String DATABASE_DRIVER_NAME =
"DATABASE_DRIVER_NAME";
public static final String DATABASE_URL =
"DATABASE_URL";
public static final String DATABASE_USER =
"DATABASE_USER";
public static final String DATABASE_PASSWORD =
"DATABASE_PASSWORD";
public static final String ERROR_PAGE_PATH =
"ERROR_PAGE_PATH";
public static final String BEAN_PATH =
"BEAN_PATH";
public static final String DATABASE_POOLSIZE =
"DATABASE_POOLSIZE";
public synchronized static ConfigurationManager getInstance() {
if (instance == null) {
instance = new ConfigurationManager();
instance.resourceBundle =
ResourceBundle.getBundle(BUNDLE_NAME);
}
return instance;
}
public String getProperty(String key) {
return (String)resourceBundle.getObject(key);
}
}
但是我想使用Spring来做(init,destroy,properties).那我该怎么办呢?
But I want to do it(init,destroy,properties), using Spring. So how could I do it?
推荐答案
当然,请使用Spring的init和destroy方法:
Use Spring's init and destroy methods, of course:
http://www.mkyong.com /spring/spring-init-method-and-destroy-method-example/
我个人认为这是不明智的.您不太可能会改善现有的池(例如C3P0).你可能做得更糟.但这是您的选择.
Personally, I think this is ill-advised. You aren't likely to improve on the pools already available to you (e.g. C3P0). You may do worse. But that's your choice.
这篇关于如何使用spring初始化,加载属性和设置我自己的连接池?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!