一尘不染

如何防止Hibernate + c3p0 + MySql创建大量睡眠连接?

hibernate

我正在将GWT与Hibernate,c3p0和MySQL结合使用,以产生一个受众有限的网络应用程序(每天最多50个用户)。在测试期间,我发现无论使用哪种close()方法,Hibernate都在打开每个会话的连接,但没有关闭它。

我当前的配置如下:

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=
hibernate.connection.username=
hibernate.connection.password=
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.current_session_context_class=thread
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=1
hibernate.c3p0.timeout=10
hibernate.c3p0.max_statements=50
hibernate.c3p0.idle_test_period=10
hibernate.c3p0.unreturned_connection_timeout=1
hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider

通过与应用程序的每个新连接,将创建一个新池。例如,如果我将池大小设置为3,则到应用程序的2个连接导致6个连接,直到应用程序关闭。

预期的行为是在每个事务之后简单地关闭或重用连接。我该如何实现?


阅读 228

收藏
2020-06-20

共1个答案

一尘不染

在测试过程中,我发现无论使用close()方法如何,Hibernate都在打开每个会话的连接,但没有关闭它

使用连接池时,调用Connection#close()不会物理上关闭连接,而是将其返回到池中以供将来重用。换句话说,连接保持打开状态,这就是使用池的全部要点。


我称之为:AnnotationConfiguration()。buildSessionFactory()。getCurrentSession();

好吧,这就是问题所在。您正在创建SessionFactory一遍又一遍(每个都创建自己的池),而在应用程序的整个生命周期中 只能 创建
一次 。如果您不使用任何特定框架,则通常是在某些实用程序类(著名的HibernateUtil类)中完成的。

官方的《Hibernate教程》提供了此类的非常基本的示例。或者看一下这个更丰富的东西。

2020-06-20