我正在将GWT与Hibernate,c3p0和MySQL结合使用,以产生一个受众有限的网络应用程序(每天最多50个用户)。在测试期间,我发现无论使用哪种close()方法,Hibernate都在打开每个会话的连接,但没有关闭它。
close()
我当前的配置如下:
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个连接,直到应用程序关闭。
预期的行为是在每个事务之后简单地关闭或重用连接。我该如何实现?
在测试过程中,我发现无论使用close()方法如何,Hibernate都在打开每个会话的连接,但没有关闭它
使用连接池时,调用Connection#close()不会物理上关闭连接,而是将其返回到池中以供将来重用。换句话说,连接保持打开状态,这就是使用池的全部要点。
Connection#close()
我称之为:AnnotationConfiguration()。buildSessionFactory()。getCurrentSession();
好吧,这就是问题所在。您正在创建SessionFactory一遍又一遍(每个都创建自己的池),而在应用程序的整个生命周期中 只能 创建 一次 。如果您不使用任何特定框架,则通常是在某些实用程序类(著名的HibernateUtil类)中完成的。
SessionFactory
HibernateUtil
官方的《Hibernate教程》提供了此类的非常基本的示例。或者看一下这个更丰富的东西。