gpt4 book ai didi

java - jdbc-pool 出现太多池耗尽错误

转载 作者:行者123 更新时间:2023-11-30 04:26:57 26 4
gpt4 key购买 nike

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

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

我编写了一份文档,通过调整池连接、增加最大等待时间等来帮助他们排除故障。但是,我开始看到很多人报告池耗尽错误,即使他们的应用程序基本上处于空闲状态。 显示完整进程列表似乎显示 1 个 Activity 连接中的 19 个连接处于“ sleep ”状态。

我在生产和开发环境中多次运行该应用程序,并且从未遇到过问题。我更擅长管理我的 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.

我也从来不喜欢查询。我们不断运行批量插入查询,但我们已经通过队列系统和批量插入对其进行了优化,因此速度非常快,并且使用尽可能少的开销。

最佳答案

据我所知,您有 close() 但不在 finally block 中。这意味着如果发生异常,连接将会丢失。我怀疑 commons-dhcp 不会像 jdbc-pool 那样处理泄漏的连接。

removeAbandoned 配置选项,默认情况下关闭,因为它是 Right Thing™。但据我了解,它不提供任何保证,因为它会在超时时关闭它们。如果短时间内出现大量异常,则可能会耗尽池。因此,更好的方法是始终关闭 finally block 中的所有连接。

关于java - jdbc-pool 出现太多池耗尽错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com