Hibernate / C3P0没有正确关闭MySQL连接(mysql.err上的连接已中止)

时间:2015-09-04 22:04:42

标签: java mysql hibernate

我有一个独立的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]错误。我不喜欢看到这些类型的警告,因为显然有些不对劲。

2 个答案:

答案 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()方法无法正确清理。