在Java进程退出之前清理连接池

时间:2013-09-10 20:49:27

标签: java mysql jdbc connection-pooling c3p0

我有一个java应用程序,每隔几分钟从脚本调用一次。流程是:

  1. 脚本每隔几分钟调用一次java进程。
  2. java程序运行几分钟(有时更少),执行一些处理,一旦通过调用System.exit(0)完成退出。
  3. 在步骤2中,为了进行处理,我们使用c3p0连接池连接到MySQL DB。
  4. 每当我们从池中获得连接时,我们都会调用close()。我们还将unreturnedConnectionTimeout设置为20,以便每当连接有太长时间或未关闭时,c3p0都会处理它。

    我的问题是,一旦步骤2中的所有处理完成,并且在我们通过调用System.exit(0)退出之前,我们是否需要清除连接池?

    我知道使用连接池调用close()只会将连接返回到池,并且实际上不会“关闭”连接。所以在退出之前我需要对conn池进行任何清理吗?如果我不进行任何清理并执行JVM退出,那么与DB的连接是否仍然存在,或者c3p0是否清除/强制关闭它们?谢谢!

1 个答案:

答案 0 :(得分:2)

如果您使用的是com.mchange.v2.c3p0.PooledDataSource的实例(例如com.mchange.v2.c3p0.ComboPooledDataSource),则可以使用com.mchange.v2.c3p0.DataSources.destroy()方法。

此方法:

  

立即释放由C3P0 DataSource保存的资源(线程和数据库连接)。

     

只有poolingDataSource()方法创建的DataSource才能保存任何非内存资源。在非池化数据源上调用此方法实际上是无操作。

     

您可以放心地假设销毁由此库创建的另一个DataSource包装的池化DataSource会破坏外部和包装的DataSource。没有理由持有对嵌套DataSource的引用,以便明确地销毁它。

PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do

DataSources.destroy(dataSource);
System.exit(0);

换句话说,(再次,如果您使用com.mchange.v2.c3p0.PooledDataSource的实例),方法com.mchange.v2.c3p0.PooledDataSource.html#hardReset()

  

立即销毁与此DataSource关联的所有池化和签出的连接。 PooledDataSource在第一次连接获取之前被重置为其初始状态,没有任何池处于活动状态,但已为请求做好准备。

PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do

dataSource.hardReset();

System.exit(0);

方法dataSource.close()是最佳选择,因为它更明显。始终建议关闭资源。连接可能会在数据库中保持打开状态,但在超时后关闭。此行为取决于数据库供应商。