我有一个每天运行一次(大约 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 个连接保持 sleep /空闲状态(通过 SQL“show processlist;”),我经常看到著名的“明显死锁!!!”警告(该错误在 c3p0 项目中仍处于打开状态 http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690)。
那么有没有办法在所有计算工作完成后关闭所有连接,在第二天再次执行任务时重新构建连接呢?谢谢。
问候, 乔伊
最佳答案
如果您希望关闭所有连接,请将 minPoolSize
和 initialPoolSize
设置为 0。另外,我建议减少 maxIdleTime
为较小的值,例如 600(10 分钟)。这种设置组合将使池能够在您的工作人员完成后快速“耗尽”。
您还可以使用 ComboPooledDataSource
中公开的 reset
方法之一强制关闭所有连接,但如果池配置正确,则没有必要。
关于java - c3p0 如何关闭所有数据库连接并在需要时重新打开它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769907/