Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java进程退出之前清理连接池_Java_Mysql_Jdbc_Connection Pooling_C3p0 - Fatal编程技术网

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

在Java进程退出之前清理连接池,java,mysql,jdbc,connection-pooling,c3p0,Java,Mysql,Jdbc,Connection Pooling,C3p0,我有一个java应用程序,每隔几分钟从脚本中调用一次。流程是: 脚本每隔几分钟调用一次java进程 java程序运行几分钟(有时更少),执行一些处理,完成后通过调用System.exit(0)退出 在步骤2中,为了进行处理,我们使用连接池连接到MySQL数据库 每次从池中获取连接时,我们都调用close()。我们还将unreturnedConnectionTimeout设置为20,以便在连接过长或未关闭时,c3p0会处理它 我的问题是,一旦步骤2中的所有处理完成,在调用System.exit(0

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

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

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


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

    如果您正在使用(例如)的实例,则可以使用该方法

    此方法:

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

    只有由poolgDataSource()方法创建的数据源才包含任何非内存资源。在未冷却的数据源上调用此方法实际上是不可行的

    您可以安全地假设,销毁围绕此库创建的另一个数据源包装的池数据源会同时销毁外部数据源和包装的数据源。没有理由为了显式销毁嵌套数据源而保留对该数据源的引用

    另一种方式是(如果您使用的是的实例),方法:

    立即销毁与此数据源关联的所有池连接和签出连接。PooledDataSource被重置为第一次连接获取之前的初始状态,没有池处于活动状态,但已准备好进行请求


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

    谢谢Paul!我看到了那个方法。问题是我需要打电话给毁灭吗?如果我不调用destroy(),jvm退出时c3p0池中的连接会发生什么变化?MySQL服务器是否也会断开连接或保持连接?还有哪一个更好:PooledDataSource.close()还是DataSources.destroy()?您只需要
    dataSource.close()
    ,因为它更简单。方法
    hardReset()
    对于维护非常有用。在任何情况下,连接都无法在JVM进程中生存。当进程退出时,操作系统将关闭所有打开的套接字,除非您运行的是像NetWare 3或4这样的怪异设备。
    PooledDataSource dataSource = new ComboPooledDataSource();
    // everything you do
    
    DataSources.destroy(dataSource);
    System.exit(0);
    
    PooledDataSource dataSource = new ComboPooledDataSource();
    // everything you do
    
    dataSource.hardReset();
    
    System.exit(0);