2015年7月8日 星期三

Hibernate中C3P0連接池的設置

在一開始使用Hibernate做ORM(Object/Relational Mapping)時,如果我們沒有配置連接池(Connection Pool),可能會發生一些底層連接Database會碰到的問題,例如sessionFactory所產生的連接太久沒有動作而被Database端以Timeout為由強行關閉,而之後在使用連接時就會出錯(在Hibernate端似乎無法用SessionFactory的isClosed()來判斷),此時就可能要自己在做CRUD(Create,Read,Update,Delete)時手動測試連接是否還在等等。

如果配置了連接池,就可以簡單地受益於連接池帶來的許多好處,例如幫我們管理連線,最小連接數量、最大連接數量、定時檢測連線等等。

在Hibernate裡已經包含了一個很好用且有名的開源數據庫連接池,C3P0,如果你在NetBeans裡使用了Hibernate框架,那麼你就可以在Library中看到C3P0的jar,如下圖紅框內所示:

對於C3P0,以下的連結提供了不錯的介紹、範例與相闗資料:

  1. C3P0百度百科
  2. How to configure the C3P0 connection pool in Hibernate
  3. 關於MySQL的wait_timeout連接超時問題報錯解決方案
  4. c3p0 - JDBC3 Connection and Statement Pooling(官方網站)
在這邊,我把我使用的例子在這邊做了一個紀錄,在Hibernate的配置文件hibernate.cfg.xml中,加入如以下配置,這樣Hibernate就會自動偵測並使用C3P0了:
        <!--==============C3P0的配置=============-->
        <!-- 最小連接數 -->
        <property name="hibernate.c3p0.min_size">5</property>
        <!-- 最大連接數 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 多久會把無用的連接視為timeout並移除到min_size的連接數量,單位毫秒 -->
        <property name="hibernate.c3p0.timeout">300</property>
        <!-- 最大的PreparedStatement的數量 -->
        <property name="hibernate.c3p0.max_statements">50</property>
        <!-- 多久進行空閒連接的檢查,確定連接還存在,例如有無被Database端關掉,單位是秒-->
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <!--======================================-->

注意:此處例出來的配置只是C3P0配置的一部份,其功能不只這些,其他的配置可以在上述的資料連接中查到。

沒有留言 :

張貼留言