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

Hibernate/C3P0 not closing MySQL connections properly (Aborted connections on 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.err 日志中收到 [Warning] 错误。我不喜欢看到这些类型的警告,因为显然有问题。

run() 方法内的代码中控制 Hibernate 会话。

有关示例,请参阅 Session 的 javadoc。如果您 Google 它,可能还有许多其他 Hibernate 会话控制示例。

如果对 HibernateUtil.closeCurrentSession() 的调用曾经执行某些操作,那么您的 run() 方法没有正确地自行清理。

Apparently, this is actually a bug from Hibernate.

我在我的 HibernateUtil 中添加了另一种关闭 C3P0ConnectionProvider 的方法,以便静态访问。

SessionFactoryImpl impl = (SessionFactoryImpl) sessionFactory;
C3P0ConnectionProvider provider = (C3P0ConnectionProvider) impl.getConnectionProvider();
provider.close();

在那之后,我再也没有看到那些讨厌的警告。