有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java c3p0数据库池错误

在我的程序以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秒,我将终止线程。知道db连接池为什么会死掉吗

谢谢


共 (2) 个答案

  1. # 1 楼答案

    在使用c3p0时,有一些属性需要在c3p0中初始化。属性文件。 其中有一个属性名为c3p0。未返回的连接超时

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

    因此,您必须找出查询可能需要的最长时间,并根据该时间设置此属性值

    干杯