如何使用spring初始化,加载属性和设置我自己的连接池? [英] How to initialise,load properties and dispose my own connection pool using spring?

查看:131
本文介绍了如何使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆