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();
在那之后,我再也没有看到那些讨厌的警告。
我有一个独立的 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();
在那之后,我再也没有看到那些讨厌的警告。