2015-09-04 97 views
1

我有一个使用Hibernate来管理SQL连接的独立Java应用程序。我使用MySQL数据库,并确保当main()方法退出时所有会话都关闭。Hibernate/C3P0没有正确关闭MySQL连接(mysql.err上的异常连接)

我的代码是这样的:

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

+1

[Hibernate连接可能重复,即使使用C3P0 +显式session.close()也不会关闭(http://stackoverflow.com/questions/9755523/hibernate-connections-are-not-closed-even-with- c3p0-explicit-session-close) – Andreas

+0

这篇文章中没有任何内容会说他正在使用C3P0。 – peterh

+0

以下解决方案对我有所帮助。 [在此输入链接描述](http://stackoverflow.com/questions/40758569/all-used-connections-in-pool-are-sleepy-new-connections-are-created/40861706#40861706) – Rajas

回答

0

Apparently, this is actually a bug from Hibernate.

我补充说,关闭我的HibernateUtil的C3P0ConnectionProvider静态地访问,以及另一种方法。

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

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

-1

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

查看javadoc的Session为例。如果你使用Google,可能会有很多其他Hibernate会话控制的例子。

如果对HibernateUtil.closeCurrentSession()的调用有所作为,那么run()方法本身没有正确清理。

+0

控制?你什么意思?手动关闭会话?因为这就是'HibernateUtil.closeCurrentSession()'所做的。 – mpmp

+0

因为我不知道你的'run()'方法在做什么或者你的HibernateUtil是如何编码的,所以很难说这里有什么问题。可能的是,您不*关闭数据库连接,所以当虚拟机退出时,连接会硬中止。 – Andreas

+0

HibernateUtil有一个ThreadLocal 对象,用于保存会话。在第一次调用HibernateUtil.getCurrentSession()时,会话对象被放入该ThreadLocal对象中。每当我HibernateUtil.getCurrentSession(),我检查是否有可用的打开会话,如果没有,我创建一个。 run()方法的功能是只查询和删除数据库中的条目。 HibernateUtil.closeCurrentSession()只是关闭在ThreadLocal对象中存在的会话(如果它存在的话)。 在这种情况下,如何手动关闭数据库连接? – mpmp