jdbc-pool的池耗尽错误太多

时间:2013-03-26 21:52:23

标签: java jdbc

我有一个应用程序在过去一个月内开始使用jdbc-pool进行MySQL连接处理。在此之前,我一直在使用Apache的commons-dbcp。我在阅读了一些显示更快,更好维护等的分析后切换到了jdbc-pool。但是,我已经开始注意到很多我的更多用户都看到了池耗尽错误。< / p>

我不知道它是否与从公共端切换到jdbc-pool有关,但它似乎从那时开始,我正在考虑构建我们的产品,将其恢复并将其提供给db错误的人看看它有什么影响。

我写了一个文档,通过调整池连接,增加最大等待等来帮助他们排除故障。但是,我开始看到很多人报告池耗尽错误,即使他们的应用程序基本上处于空闲状态。 show full processlist似乎在1个连接活动中的“睡眠”中显示19个连接。

我在生产环境和开发环境中经常运行应用程序并且从未遇到过问题。我更擅长管理我的mysql环境,但竞争对手产品的池化系统较弱,没有这样的问题。

我花了很多时间阅读jdbc和汇集文档,但我做的事情会导致性能不佳吗?

这些是我们的数据库连接代码示例,其中包含我们使用的默认值。

// Called once on application start, connects to the database
public DataSource initDbPool(){
    String dns = "jdbc:mysql://"+config.getString("prism.mysql.hostname")+":"+config.getString("prism.mysql.port")+"/"+config.getString("prism.mysql.database");
    pool = new DataSource();
    pool.setDriverClassName("com.mysql.jdbc.Driver");
    pool.setUrl(dns);
    pool.setUsername( /*username*/ );
    pool.setPassword( /*password*/ );
    pool.setInitialSize( 10 );
    pool.setMaxActive( 20 );
    pool.setMaxIdle( 10 );
    pool.setMaxWait( 30000 );
    pool.setRemoveAbandoned(true);
    pool.setRemoveAbandonedTimeout(60);
    return pool;
}

// Called from various classes that need to run queries
public static Connection dbc(){
    Connection con = null;
    try {
        con = pool.getConnection();
    } catch (SQLException e) {
        System.out.print("Database connection failed. " + e.getMessage());
        e.printStackTrace();
    }
    return con;
}

The actual code can be seen here.

我对查询也不太喜欢。我们一直在运行批量插入查询,但我们已经使用队列系统和批量插入对其进行了优化,因此它非常快并且使用尽可能少的开销。

1 个答案:

答案 0 :(得分:2)

我看到你有close()但不在finally块中。这意味着如果发生异常,连接将丢失。我怀疑commons-dhcp不会像jdbc-pool一样处理泄露的连接。

removeAbandoned配置选项,默认为off,因为它是Right Thing™。但据我所知,它没有给出任何保证,因为它会通过超时关闭它们。如果你在很短的时间内有很多例外,它可能会耗尽游泳池。因此,更好的方法是始终关闭finally块中的所有连接。