1. 程式人生 > >Hibernate第十一篇【配置C3P0資料庫連線池、執行緒Session】

Hibernate第十一篇【配置C3P0資料庫連線池、執行緒Session】

Hibernate連線池

Hibernate自帶了連線池,但是呢,該連線池比較簡單..而Hibernate又對C3P0這個連線池支援…因此我們來更換Hibernate連線池為C3P0

檢視Hibernate自帶的連線池

我們可以通過Hibernate.properties檔案中檢視Hibernate預設配置的連線池

hibernate.properties的配置檔案可以在\project\etc找到

Hibernate的自帶連線池啥都沒有,就一個連線數量為1

這裡寫圖片描述

檢視Hibernate對C3P0的支援

  • #hibernate.c3p0.max_size 2 最大連線數
  • #hibernate.c3p0.min_size 2 最小連線數
  • #hibernate.c3p0.timeout 5000 超時時間
  • #hibernate.c3p0.max_statements 100 最大執行的命令的個數
  • #hibernate.c3p0.idle_test_period 3000 空閒測試時間
  • #hibernate.c3p0.acquire_increment 2 連線不夠用的時候, 每次增加的連線數
  • #hibernate.c3p0.validate false

這裡寫圖片描述

修改Hibernate連線池

我們在hibernate.cfg.xml中配置C3p0,讓C30P0作為Hibernate的資料庫連線池

查詢Hibernate支援的連線池元件有什麼

這裡寫圖片描述

既然找到了,那麼我們在hibernate.cfg.xml中配置對應的類就和相關配置就行了


        <!-- 【連線池配置】 -->
        <!-- 配置連線驅動管理類 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- 配置連線池引數資訊 -->
<property name="hibernate.c3p0.min_size">2</property> <property name="hibernate.c3p0.max_size">4</property> <property name="hibernate.c3p0.timeout">5000</property> <property name="hibernate.c3p0.max_statements">10</property> <property name="hibernate.c3p0.idle_test_period">30000</property> <property name="hibernate.c3p0.acquire_increment">2</property>

執行緒Session

我們建立Session的時候,有兩個方法

  • openSession()【每次都會建立新的Session】
  • getCurrentSession()【獲取當前執行緒的Session,如果沒有則建立】

一般地,我們使用執行緒Session比較多

如果要使用getCurrentSession(),需要在配置檔案中配置:

        <!--配置執行緒Session-->
        <property name="hibernate.current_session_context_class">thread</property>

測試資料


@Test
    public void testSession() throws Exception {
        //openSession:  建立Session, 每次都會建立一個新的session
        Session session1 = sf.openSession();
        Session session2 = sf.openSession();
        System.out.println(session1 == session2);
        session1.close();
        session2.close();

        //getCurrentSession 建立或者獲取session
        // 執行緒的方式建立session  
        // 一定要配置:<property name="hibernate.current_session_context_class">thread</property>
        Session session3 = sf.getCurrentSession();// 建立session,繫結到執行緒
        Session session4 = sf.getCurrentSession();// 從當前訪問執行緒獲取session
        System.out.println(session3 == session4);

        // 關閉 【以執行緒方式建立的session,可以不用關閉; 執行緒結束session自動關閉】
        //session3.close();
        //session4.close(); 報錯,因為同一個session已經關閉了!
    }