高连接问题

时间:2014-12-05 03:20:05

标签: java struts-1 c3p0

使用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被获得并且稍后当它被释放时)我可以确认此过程中没有泄漏。获得的所有连接都被释放回池中。

我不确定上述信息是否足以回答。如果需要额外的信息,请告诉我。

2 个答案:

答案 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();
      }
}