首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过多的jdbc池中的池耗尽错误

过多的jdbc池中的池耗尽错误
EN

Stack Overflow用户
提问于 2013-03-26 21:52:23
回答 1查看 1K关注 0票数 1

在过去的一个月里,我有一个应用程序开始使用jdbc-pool来处理MySQL连接。在此之前,我一直在使用Apache的commons-dbcp。在阅读了一些分析后,我转向了jdbc池,这些分析显示它更快,更好地维护,等等。然而,我开始注意到,我的用户中有更多的人看到了池耗尽错误。

我不知道这是否与从公域切换到jdbc池有关,但它似乎是从那时开始的,我正在考虑对我们的产品进行一个可恢复的构建,并将其提供给有db错误的人,看看它会产生什么样的影响。

我编写了一份文档,通过调整池连接、增加最大等待时间等来帮助他们排除故障。然而,我开始看到许多人报告池耗尽错误,即使他们的应用程序本质上是空闲的。一个show full processlist似乎显示了一个连接活动的“睡眠”中的19个连接。

我在生产环境和开发环境中都运行了大量的应用程序,而且从来没有遇到过问题。我在管理mysql环境方面做得更好,但是具有较弱的池系统的竞争对手产品没有这样的问题。

我花了很多时间阅读jdbc和池文档,但是是不是在做一些会导致性能差的呢?

这些是我们的db连接代码的示例,其中包含我们使用的默认设置。

代码语言:javascript
复制
// 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;
}

实际的代码可以在这里看到。

我也从来不喜欢问询。我们不断地运行批处理插入查询,但是我们已经通过队列系统和批处理插入优化了它,所以它非常快,并且使用尽可能少的开销。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 22:27:25

如我所见,您有close(),但不在finally块中。这意味着如果出现异常,连接将丢失。我怀疑commons-dhcp没有像jdbc-pool那样处理泄漏的连接。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15648076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档