使用Struts 1.1和普通JDBC的我的prod Java EE应用程序托管在OC4J(10g)应用服务器中。
我的实时应用程序中有一个非常奇怪的问题。有时它会打开大约1000个连接。我使用C3P0作为连接池库,并设置了1000个连接的最大连接限制。实际上,即使500连接在正常情况下也应该足够了。我有一个作业每30秒运行一次,以记录池中繁忙,空闲和总连接的数量。即使在高峰时间,这个计数也永远不会超过200个连接。但有时它会突然打开1000个连接。日志显示该时间点大约有800个连接正忙。再过30秒后,计数恢复正常。
我也在获取和释放连接时记录(例如com.mchange.v2.c3p0.impl.NewProxyConnection@1fa6aea被获得并且稍后当它被释放时)我可以确认此过程中没有泄漏。获得的所有连接都被释放回池中。
我不确定上述信息是否足以回答。如果需要额外的信息,请告诉我。
答案 0 :(得分:0)
您的应用程序负载是否测试了大约800-1000个并发用户?
这可能是因为您的数据库在峰值负载期间响应请求时成为瓶颈。如果使用tomcat的jdbc连接池,则它具有检测connection leaks或放弃连接的属性,这些连接打开的时间长于配置的超时。请参阅this链接。
答案 1 :(得分:0)
如果您没有使用任何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();
}
}