我的程序以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个DB线程将结果插入到我的数据库中。如果爬网任务花费超过20秒,我就会杀死该线程。有什么想法为什么数据库连接池会死掉?
感谢
答案 0 :(得分:3)
使用c3p0时,您需要在c3p0.properties文件中初始化一些属性。 其中有一个名为 c3p0.unreturnedConnectionTimeout 的属性。
它的值以秒为单位。如果某些查询未在指定的时间段内返回结果(如您在c3p0.properties文件中为c3p0.unreturnedConnectionTimeout属性指定的那样),那么将破坏当前会话并从会话池中提取新会话,但您的代码正在处理以前的会话已被销毁。因此,您的代码会抛出会话已关闭异常
因此,您必须找出查询可能需要的最长时间,并根据该值设置此属性值。
干杯
答案 1 :(得分:0)
此论坛发帖可能会对您有所帮助:http://old.nabble.com/A-checked-out-resource-is-overdue--td20545738.html#a20575081
对于被杀死的线程,是否有连接返回池?