将BreakAfterAcquireFailure设置为true时,DataSource的Connection没有重新连接

时间:2013-12-06 06:32:27

标签: java mysql connection-pooling c3p0

我将BreakAfterAcquireFailure设置为true,MaxIdleTime和MaxConnectionAge的值为10(非常小)。如下所示:

ComboPooledDataSource ds = new ComboPooledDataSource(db);
ds.setAcquireRetryAttempts(3);
ds.setBreakAfterAcquireFailure(true);
ds.setMaxIdleTime(10);
ds.setMaxConnectionAge(10);
ds.setMaxPoolSize(2);
ds.setMinPoolSize(1);
ds.setTestConnectionOnCheckin(false);
ds.setIdleConnectionTestPeriod(10);
ds.setPreferredTestQuery("select 1");

为什么ComboPooledDataSource.getConnection()总是在重启mysql很长一段时间后抛出异常。

谁能帮帮我?非常感谢。

1 个答案:

答案 0 :(得分:2)

breakAfterAcquireFailure means正是c3p0将尝试从dbms中断中恢复。如果设置了breakAfterAcquireFailure,则DataSource eill只会在发现无法获取新连接时将其标记为已损坏,并且永远不会再次尝试。如果您希望DataSource从结果中恢复,请将该参数保留为其默认值false

您不希望maxIdleTimemaxConnectionAge这么小的值。这太可怕了。如果您依赖空闲的连接测试,最好还将testConnectionOnCheckin设置为true。 10秒可能比idleConnectionTestPeriod需要的更激进。鉴于你的游泳池大小参数,我认为你只是测试/玩这个。 (maxPoolSize of 2对于大多数用途来说太小了。)