我有一个独立的Java应用程序,它使用Hibernate来管理SQL连接。我使用MySQL数据库,并确保在main()方法退出时关闭所有会话。
我的代码是这样的:public static void main(String[] args) {
logger.info("Starting app");
App instance = new App();
try {
instance.run();
} catch (Exception e) {
logger.error("failed to complete run", e);
} finally {
HibernateUtil.closeCurrentSession();
}
logger.info("Finished run");
}
现在,每次这个主方法退出时,我在sql错误日志中看到一个日志说:[Warning] Aborted connection 41533470 to db: 'user' user: 'some_user' host: 'some_ip_address_here' (Got an error reading communication packets)
这是否意味着MySQL手动杀死它?如果是这样,我如何优雅地关闭MySQL连接?如果我能正确地回忆我的Hibernate,关闭会话只是把它们放回会话池…我不确定如何完全告诉Hibernate释放它与MySQL的连接。
编辑:我使用C3P0这个-抱歉忘记早些时候提到。我的连接确实关闭,但这只是我得到[警告]错误在我的mysql。错误日志。我不喜欢看到这种类型的警告,因为很明显有问题。
显然,这实际上是Hibernate的一个bug。
我添加了另一个方法,关闭C3P0ConnectionProvider在我的HibernateUtil静态访问。
SessionFactoryImpl impl = (SessionFactoryImpl) sessionFactory;
C3P0ConnectionProvider provider = (C3P0ConnectionProvider) impl.getConnectionProvider();
provider.close();
从那以后,我再也没有看到过那些烦人的警告。
您可以在代码中的run()
方法中控制Hibernate会话。
例如:javadoc of Session
。如果你谷歌一下,可能还有很多Hibernate会话控制的其他例子。
如果对HibernateUtil.closeCurrentSession()
的调用做了一些事情,那么您的run()
方法没有正确地清理自己。