需求:最近做了个后台运行的jar包应用,没有采用web容器,采用java -jar xxxxx的方式运行。数据库连接池采用c3p0,关闭应用后
发现数据库会话依然存在。
解决方案:采用Runtime.getRuntime().addShutdownHook(Thread hook)在应用关闭前关闭数据库连接,该方法适用于采用
System.exit(int)退出应用的方式。 因为jar包采用的是main方法启动(main方法是应用的入口和出口),因此直接将
Runtime.getRuntime().addShutdownHook(Thread hook)放在了main方法中。(Runtime 就是java.lang.Runtime).
因为我采用Guice管理数据源,所以下面通过Injector获取应用的DataSource。
代码:
import javax.sql.DataSource;
import com.google.inject.Injector;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ShutdownHookTest {
private static Injector injector;
static {
// TODO initiate injector
System.out.println("injector has been initiated.");
}
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
DataSource ds = injector.getInstance(DataSource.class);
((ComboPooledDataSource) ds).close();
System.out.println("Successfully closed the dataSource.");
}
});
}
}