1

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

  1. 脚本每隔几分钟调用一次 java 进程。
  2. java 程序运行几分钟(有时更短),进行一些处理,一旦完成,通过调用 System.exit(0) 退出。
  3. 在第 2 步中,为了进行处理,我们使用c3p0连接池连接到 MySQL DB。

每次我们从池中获得连接时,我们都会调用close(). 我们还unreturnedConnectionTimeout设置了20这样,任何时候连接的帮助时间过长或未关闭,c3p0 都会处理它。

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

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

4

1 回答 1

2

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

这种方法:

立即释放 C3P0 数据源持有的资源(线程和数据库连接)。

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

您可以放心地假定,销毁包装在此库创建的另一个 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()是最佳选择,因为它更明显。始终建议关闭资源。连接可能会在数据库中保持打开一段时间,但在超时后会关闭。此行为取决于数据库供应商。

于 2013-09-10T21:22:40.883 回答