5

休眠連接到MySQL我的db未關閉。在10秒鐘內點擊10次之後,我從MySQL Workbench(在我的開發機器中獲得了這個連接統計信息,我是唯一的用戶)。 MySQL Workbench Server Status

我有那些地方即使使用C3P0 +顯式會話,休眠連接也不會關閉。()

  • C3P0和運行(從log4j的檢查,有關C3P0沒有問題,似乎運行)
  • ,檢查是否有一個開放的會議,並關閉它在一個ServletReqestListener requestDestroyed()方法。
  • Hibernate Session對象被保存在ThreadLocal中,所以每個請求只有一個連接,它在第一個查詢時打開,並在ServletRequestListener中關閉。
  • 每次我打開一個會話並關閉一個會話時,我都會輸出「Session Opened」和「Session Closed」給System.out,就像在代碼示例中那樣。在每次請求時,每頁刷新,我得到「Session Opened」,並在「Session Closed」之後,分別爲。所以我的小邏輯奏效。但連接並未關閉。

我的hibernate.cfg.xml

<property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.password">officenic</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost/officenic</property> 
<property name="hibernate.connection.username">officenic</property> 
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 

<!-- configuration pool via c3p0 --> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="hibernate.c3p0.max_size">5</property> 
<property name="hibernate.c3p0.max_statements">0</property> 
<property name="hibernate.c3p0.min_size">1</property> 
<property name="hibernate.c3p0.timeout">100</property> <!-- seconds --> 

的代碼塊我每次打電話,我想關閉會話。

if (session == null) 
    return; 

if (session.isOpen()) { 

     if (session.isDirty()) 
     session.flush(); 

    session.close(); 
    System.out.println("Session closed"); 
} 

難道我錯過了什麼?

回答

1
private static final ThreadLocal<Session> session = new ThreadLocal<Session>(); 

public static void closeSession() throws HibernateException { 
    Session s = session.get(); 
    if (s != null) { 
     s.close(); 
     session.remove(); 
    } 
} 

其實我做這樣和它的作品

+0

是的,我的也是類似的東西,很好的解決方案。 – Seregwethrin 2012-03-24 15:50:43