我有一个jdbc-pool
在上个月开始用于 MySQL 连接处理的应用程序。在此之前,我一直在使用 Apache 的commons-dbcp
. 在阅读了一些显示它更快、维护得更好等的分析后,我切换到了 jdbc-pool。但是,我开始注意到我的更多用户看到池耗尽错误。
我不知道这是否与从 commons 切换到 jdbc-pool 有关,但它似乎从那个时候开始,我正在考虑构建我们的产品以恢复并将其提供给有 db 错误的人,看看有什么影响它有。
我编写了一个文档,通过调整池连接、增加最大等待等来帮助他们进行故障排除。但是,我开始看到很多人报告池耗尽错误,即使他们的应用程序基本上是空闲的。Ashow full processlist
似乎显示 19 个连接处于“睡眠”状态,其中 1 个连接处于活动状态。
我在生产和开发环境中都经常运行该应用程序,并且从未遇到过问题。我更擅长管理我的 mysql 环境,但池系统较弱的竞争对手产品没有这样的问题。
我花了很多时间阅读 jdbc 和 pooling 文档,但是我做的事情会导致性能下降吗?
这些是我们使用默认值的数据库连接代码示例。
// 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;
}
我也从不喜欢查询。我们一直在运行批量插入查询,但我们已经通过队列系统和批量插入对其进行了优化,因此它非常快并且使用尽可能少的开销。