2015-01-08 84 views
1

我使用Hibernate 4.3.0以及MySQL和Tomcat。所有需要的庫都在類路徑中,這裏是一個hibernate.cfg.xmlHibernate需要的C3P0設置是什麼?

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="show_sql">false</property> 
<property name="hbm2ddl.auto">update</property> 
<property name="hibernate.connection.autocommit">false</property> 
<property name="current_session_context_class">thread</property> 

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

<!-- Disable the second-level cache --> 
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">20</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.timeout">3000</property> 
<property name="hibernate.c3p0.idle_test_period">300</property> 

通過以上的設置,20後與數據庫的連接應用程序沒有連接了,和餘did't找到關於這種行爲的信息應用程序日誌。

有誰知道什麼是錯的,以及我如何正確設置c3p0和hibernate?

回答

2

設置很好。連接用完的原因是因爲連接沒有正確釋放。

確保您:

  • 提交成功的交易
  • 失敗
  • ROLLBACK TRANSACTION
  • 你用它完成後關閉Hibernate會話:

所以,這如果您沒有Spring代表您處理交易/會話管理,那麼您應該如何操作Hibernate會話:

Session session = factory.openSession(); 
Transaction tx = null; 
try { 
    tx = session.beginTransaction();  
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
}finally { 
    session.close(); 
} 
+0

這發生在不需要交易的操作上,據我所知。我更改了我的代碼以關閉工廠(和會話對象): 'SessionFactory factory = HibernateUtil.getSessionFactory(); Session hSession = factory.openSession(); Criteria count = hSession.createCriteria(UserTable.class); count.setProjection(Projections.rowCount()); long total =(long)count.uniqueResult(); hSession.close();工廠.close();' 但結果與以前一樣。 – andy007

+0

HibernateUtil類可能有問題嗎? – andy007

+0

您只需在應用程序關閉時關閉會話工廠,因爲在每次方法調用時創建的對象是一個昂貴的對象。試試我的建議。 –