我有一个独立的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");
}
现在,每次这个main方法退出时,我都会看到我的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.err日志上出现[Warning]错误。我不喜欢看到这些类型的警告,因为显然有些不对劲。
答案 0 :(得分:0)
Apparently, this is actually a bug from Hibernate.
我添加了另一个关闭HibernateUtil中的C3P0ConnectionProvider的方法,也可以静态访问。
SessionFactoryImpl impl = (SessionFactoryImpl) sessionFactory;
C3P0ConnectionProvider provider = (C3P0ConnectionProvider) impl.getConnectionProvider();
provider.close();
在那之后,我再也没有看到那些令人讨厌的警告。
答案 1 :(得分:-1)
您在run()
方法中控制代码中的Hibernate会话。
有关示例,请参阅gulp-replace的javadoc。如果您使用Google,可能会有很多其他Hibernate会话控制示例。
如果对HibernateUtil.closeCurrentSession()
的调用做了某些事情,那么您的run()
方法无法正确清理。