Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 高连接问题_Java_Struts 1_C3p0 - Fatal编程技术网

Java 高连接问题

Java 高连接问题,java,struts-1,c3p0,Java,Struts 1,C3p0,我的ProdJavaEE应用程序使用Struts1.1和普通JDBC,托管在OC4J(10g)应用服务器上 我的现场申请中有一个非常奇怪的问题。有时它会打开大约1000个连接。我使用C3P0作为连接池库,并设置了1000个连接的最大连接限制。实际上,在正常情况下,即使是500个连接也应该足够了。我每30秒运行一次作业,记录池中繁忙、空闲和总连接数。即使在高峰时间,此计数也不会超过200个连接。但有时它会突然打开多达1000个连接。日志显示当时大约有800个连接处于繁忙状态。再过30秒,计数恢复正

我的ProdJavaEE应用程序使用Struts1.1和普通JDBC,托管在OC4J(10g)应用服务器上

我的现场申请中有一个非常奇怪的问题。有时它会打开大约1000个连接。我使用C3P0作为连接池库,并设置了1000个连接的最大连接限制。实际上,在正常情况下,即使是500个连接也应该足够了。我每30秒运行一次作业,记录池中繁忙、空闲和总连接数。即使在高峰时间,此计数也不会超过200个连接。但有时它会突然打开多达1000个连接。日志显示当时大约有800个连接处于繁忙状态。再过30秒,计数恢复正常

当获取并释放连接时,我也会记录日志(例如com.mchange.v2.c3p0.impl)。NewProxyConnection@1fa6aea我可以确认在这个过程中没有泄漏。在中获取的所有连接都被释放回池中


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

您的应用程序是否针对约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,在应用程序中,它已经像您建议的那样完成了。我可以确认没有一个连接保持打开状态,这意味着连接最终总是关闭的。