【问题标题】:Hibernate/C3P0 not closing MySQL connections properly (Aborted connections on mysql.err)Hibernate/C3P0 未正确关闭 MySQL 连接(mysql.err 上的连接已中止)
【发布时间】:2015-09-04 22:04:42
【问题描述】:

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

【问题讨论】:

标签: java mysql hibernate


【解决方案1】:

Apparently, this is actually a bug from Hibernate.

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

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

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

【讨论】:

    【解决方案2】:

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

    参见Session 的javadoc 示例。如果您使用 Google 搜索,可能还有许多其他 Hibernate 会话控制示例。

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

    【讨论】:

    • 控制?你是什​​么意思?手动关闭会话?因为这就是 HibernateUtil.closeCurrentSession() 所做的。
    • 因为我不知道你的run() 方法在做什么或者你的 HibernateUtil 是如何编码的,所以很难说这里出了什么问题。很可能,您没有关闭数据库连接,因此当 VM 退出时连接会被硬中止。
    • HibernateUtil 有一个 ThreadLocal 对象,我在其中保存会话。在第一次调用 HibernateUtil.getCurrentSession() 时,会话对象被放入该 ThreadLocal 对象中,每次我 HibernateUtil.getCurrentSession() 时,我检查是否有可用的打开会话,如果没有,我创建一个。 run() 方法的作用是它只是从数据库中查询和删除条目。 HibernateUtil.closeCurrentSession() 只是关闭 ThreadLocal 对象中的会话(如果存在)。这种情况下,如何手动关闭数据库连接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2012-09-29
    • 2017-01-16
    • 1970-01-01
    • 2023-03-26
    • 2017-06-06
    相关资源
    最近更新 更多