我有一个 TimerTask 每天运行一次(大约 1 或 2 小时)。每次运行时,它都会创建数百个线程来为 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;'),并且我经常看到著名的“明显死锁!!!”警告(该错误在 c3p0 项目中仍处于打开状态).
那么有没有办法在所有计算工作完成后关闭所有连接,并在第二天再次执行任务时重新构建连接呢?谢谢。
问候,
乔伊
如果您希望关闭所有连接,请设置minPoolSize
and initialPoolSize
到 0。此外,我建议减少maxIdleTime
为更小的值,如 600(10 分钟)。这种设置组合将使池在您的工作人员完成后快速“耗尽”。
您还可以使用其中之一强制关闭所有连接reset
中暴露的方法ComboPooledDataSource
,但如果池配置正确,则没有必要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)