Java 高连接问题
我的ProdJavaEE应用程序使用Struts1.1和普通JDBC,托管在OC4J(10g)应用服务器上 我的现场申请中有一个非常奇怪的问题。有时它会打开大约1000个连接。我使用C3P0作为连接池库,并设置了1000个连接的最大连接限制。实际上,在正常情况下,即使是500个连接也应该足够了。我每30秒运行一次作业,记录池中繁忙、空闲和总连接数。即使在高峰时间,此计数也不会超过200个连接。但有时它会突然打开多达1000个连接。日志显示当时大约有800个连接处于繁忙状态。再过30秒,计数恢复正常 当获取并释放连接时,我也会记录日志(例如com.mchange.v2.c3p0.impl)。NewProxyConnection@1fa6aea我可以确认在这个过程中没有泄漏。在中获取的所有连接都被释放回池中Java 高连接问题,java,struts-1,c3p0,Java,Struts 1,C3p0,我的ProdJavaEE应用程序使用Struts1.1和普通JDBC,托管在OC4J(10g)应用服务器上 我的现场申请中有一个非常奇怪的问题。有时它会打开大约1000个连接。我使用C3P0作为连接池库,并设置了1000个连接的最大连接限制。实际上,在正常情况下,即使是500个连接也应该足够了。我每30秒运行一次作业,记录池中繁忙、空闲和总连接数。即使在高峰时间,此计数也不会超过200个连接。但有时它会突然打开多达1000个连接。日志显示当时大约有800个连接处于繁忙状态。再过30秒,计数恢复正
我不确定上述信息是否足以回答问题。如果需要额外的信息,请告诉我。您的应用程序是否针对约800-1000个并发用户进行了负载测试
这可能是因为您的数据库在峰值负载期间响应请求时成为瓶颈。如果使用tomcat的jdbc连接池,则它具有检测或放弃连接的属性,这些连接的打开时间比配置的超时时间长。请参阅链接。如果您没有使用任何ORM框架,那么您的JDBC代码应该编写如下。 请注意,连接在finally块中关闭,而不是在try块中关闭
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
您是否记录了连接在返回池之前的使用时间?听起来像是从池中获取连接,并在返回之前将其保留很长时间。在我们的环境中,当我们将Tomcat与commons dpcp和c3p0一起使用时,就会发生这种情况。我们试图找到根本原因,但最终找不到任何东西,我们使用bonecp连接池修复了它。但是我们在这个问题上找不到任何东西。@Jeff我在进程完成后立即返回到池的连接。实际上在每个函数的finally块中。即使在很长的一段时间内,我也能看到connection的close方法会在获取后立即调用,或者在调用后几行调用。你能解释一下“当时大约有800个连接中断了”是什么意思吗?谢谢。@SteveWaldman很抱歉输入错误,我是说800个连接很忙。我正在从ComboPooledDataSource.getNumConnections()、ComboPooledDataSource.getNumIdleConnections()和ComboPooledDataSource.getNumBusyConnections()获取连接计数。最后一个函数返回了811,我已经在DB中登录了。不,我们从未测试过800-1000个并发用户。看起来不可能有太多用户访问该应用程序。我们没有超过200个活跃用户在高峰时间访问应用程序。DB瓶颈可能是一个原因,但我们检查了一下,DB没有显示任何锁,活动图也很正常。我们没有使用任何ORM,在应用程序中,它已经像您建议的那样完成了。我可以确认没有一个连接保持打开状态,这意味着连接最终总是关闭的。