我有一个每天运行一次(约1或2小时)的TimerTask。并且在每次运行时,它将创建数百个线程来为MySQL数据库中的每个表执行一些计算工作。我使用c3p0作为数据库源连接池(每个线程在计算之前获得连接并在计算之后关闭连接)。我将连接池配置设置如下,
cpDs = new ComboPooledDataSource();
cpDs.setMinPoolSize(10);
cpDs.setMaxPoolSize(20);
cpDs.setMaxStatementsPerConnection(10);
在测试期间,我发现在第二天运行时所有数据库连接都丢失了,并且日志文件中显示了许多“由于底层异常导致的通信链接失败”。所以我添加了以下配置,以便在使用之前测试连接。
// 7 hours, less than MYSQL default value - 8 hours
cpDs.setMaxIdleTime(25200);
cpDs.setTestConnectionOnCheckout(true);
cpDs.setPreferredTestQuery("select 1");
但我观察到当TimerTask没有运行时,总有10个连接保持睡眠/空闲状态(通过SQL'show processlist;'),我经常看到着名的“APPARENT DEADLOCK !!!”警告(错误在c3p0项目http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690中仍处于打开状态)。
有没有办法在完成所有计算工作后关闭所有连接,并在第二天重新构建连接时再次执行任务?谢谢。
此致 乔伊
答案 0 :(得分:4)
如果您希望关闭所有关联,请将minPoolSize
和initialPoolSize
设置为0.此外,我建议将maxIdleTime
缩小为较小的值,例如600(10分钟) )。这种设置组合将使您的工作人员完成后可以快速“排空”。
您还可以使用reset
中公开的ComboPooledDataSource
方法之一强制关闭所有连接,但是如果池配置正确则不需要。