Hibernate/C3P0没有正确关闭MySQL连接(MySQL .err上的连接被终止)



我有一个独立的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()方法没有正确地清理自己。

相关内容

  • 没有找到相关文章

最新更新