0

在我的程序以 3cp0 作为我的连接池运行 30 分钟左右后,我收到以下异常。

这是错误:

   [java]  INFO [Timer-0] (BasicResourcePool.java:1392) - A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@eaecb09
    [java] The last packet successfully received from the server was 375,017 milliseconds ago.  The last packet sent successfully to the server was 9 milliseconds ago.
    [java] Exception in thread "main" java.lang.NullPointerException
    [java]  at com.mytest.myorg.MyProg.MyProgRunner.main(MyProgRunner.java:104)

我正在像这样设置我的游泳池:

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver            
cpds.setJdbcUrl( "jdbc:mysql://"+hostname+"/"+database );
cpds.setUser(username);                                  
cpds.setPassword(password);  
cpds.setMinPoolSize(5);                                     
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(15);
cpds.setAutoCommitOnClose(true);
cpds.setIdleConnectionTestPeriod(300);
cpds.setMaxStatements(180);
cpds.setNumHelperThreads(20);
cpds.setUnreturnedConnectionTimeout(300);

我有 100 个线程来抓取页面,然后有 15 个数据库线程将结果插入到我的数据库中。如果抓取任务需要超过 20 秒,我会终止线程。任何想法为什么数据库连接池会死掉?

谢谢

4

2 回答 2

4

在使用 c3p0 时,您需要在 c3p0.properties 文件中初始化一些属性。其中有一个名为c3p0.unreturnedConnectionTimeout的属性。

它的值以秒为单位。如果某些查询在指定时间段内没有返回结果(如您在 c3p0.properties 文件中为 c3p0.unreturnedConnectionTimeout 属性指定的那样),则当前会话将被销毁,新会话将从会话池中拉出,但您的代码正在运行上一个会话已经被销毁。所以你的代码抛出会话已经关闭异常

因此,您必须找出查询可能花费的最长时间,并据此设置此属性值。

干杯

于 2013-07-15T09:06:36.983 回答
0

此论坛帖子可能对您有所帮助:http: //old.nabble.com/A-checked-out-resource-is-overdue--td20545738.html#a20575081

在被杀死的线程的情况下,连接是否返回到池中?

于 2010-07-22T21:32:21.760 回答