如何在Java中正确关闭和维护连接池中的连接

时间:2016-05-07 14:02:30

标签: java jdbc database-connection c3p0

几周前,我开始使用JDBC建立与mysql数据库的连接并发送查询。但是,我注意到它减慢了我的Java应用程序,所以我开始阅读有关连接池的内容。我决定使用c3p0来建立我的连接池。这是我使用的代码:

public static void setUpPool(String id, String pass, String url, String driver) {

    cpds = new ComboPooledDataSource();
    try {
        cpds.setDriverClass(driver);
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
    cpds.setJdbcUrl(url);
    cpds.setUser(id);
    cpds.setPassword(pass);

    // the settings below are optional -- c3p0 can work with defaults
    cpds.setMinPoolSize(3);
    cpds.setAcquireIncrement(5);
    cpds.setMaxPoolSize(20);

}

public static Connection getConnection() {
    // The DataSource cpds is now a fully configured and usable pooled
    // DataSource
    try {
        return cpds.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

所以我的问题是 1.一旦完成连接,你如何正确摆脱连接? close()就够了吗? 2.我应该使用方法cpds.setCheckoutTimeout(checkoutTimeout)吗? 3.在连接池中维护连接时,我还应该记住什么吗?

此外,我也收到此警告:警告:池大小配置错误,启动3< min 5.使用5作为开始。有谁知道这意味着什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 完成后如何正确摆脱连接? close()就够了吗?
  2.   

是。只需确保每个Connection都使用try-with-resources或仔细编写的finally子句[仔细编写,以便在关闭(例如,关闭)其他资源时例外,不会阻止Connections关闭()叫]。

  
      
  1. 我应该使用方法cpds.setCheckoutTimeout(checkoutTimeout)吗?
  2.   

不,不一定。如果您的应用程序运行良好,则几乎不需要它,因为将立即检出Conections。如果您的应用程序泄漏Connections(即,您有时无法关闭它们),那么缺少签出超时将导致客户端无限期挂起,这很有用。 checkoutTimeout最有用的情况是,由于硬件限制或其他原因,您无法将应用程序配置为始终处理其负载,并且您宁愿告诉客户稍后回来,而不是让他们排队。

  
      
  1. 在连接池中维护连接时,还有什么需要记住的吗?
  2.   

是。您应该设置连接测试。这可能就像添加

一样简单
cpds.setTestConnectionOnCheckout( true )

到你的setUpPool(...)方法。见here