java - c3p0 如何关闭所有数据库连接并在需要时重新打开它们?

标签 java jdbc c3p0

我有一个每天运行一次(大约 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)。

那么有没有办法在所有计算工作完成后关闭所有连接,在第二天再次执行任务时重新构建连接呢?谢谢。

问候, 乔伊

最佳答案

如果您希望关闭所有连接,请将 minPoolSizeinitialPoolSize 设置为 0。另外,我建议减少 maxIdleTime为较小的值,例如 600(10 分钟)。这种设置组合将使池能够在您的工作人员完成后快速“耗尽”。

您还可以使用 ComboPooledDataSource 中公开的 reset 方法之一强制关闭所有连接,但如果池配置正确,则没有必要。

关于java - c3p0 如何关闭所有数据库连接并在需要时重新打开它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769907/

相关文章:

sql - 使用 HSQLDB 和 Spring 嵌入式数据库启用连接池

java - jdbc4.CommunicationsException - 神秘超时

java - 使用来自 java 8 的 cacerts 更新 java 6

java - 从共享首选项中记住上一个数组

java - PreparedStatement、浮点值和 postgresql

java - 无法加载驱动程序类 : com. microsoft.jdbc.sqlserver.SQLServerDriver

java - 从 NewProxyConnection 中解开 NewProxyConnection 和 GetConnection

JAVA根据ComboBox的值设置String

java - 当foc jars包含在eclipse中时,图标消失了

java - 将 AbstractTableModel 实现为 JTable。如何添加方法?