1. 程式人生 > >hibernate的二級快取和資料池的配置

hibernate的二級快取和資料池的配置

 

hibernate對連線池的支援

連線池,

         作用: 管理連線;提升連線的利用效率!

         常用的連線池: C3P0連線池

 

Hibernate自帶的也有一個連線池,且對C3P0連線池也有支援!

 

Hbm 自帶連線池:

         只維護一個連線,比較簡陋。

         可以檢視hibernate.properties檔案檢視連線池詳細配置:

 

#################################

### Hibernate Connection Pool ###    

#################################

 

hibernate.connection.pool_size 1        【Hbm 自帶連線池: 只有一個連線

 

 

 

###########################

### C3P0 Connection Pool###                      【Hbm對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

 

【Hbm對C3P0連線池支援,  核心類】

 告訴hib使用的是哪一個連線池技術。

#hibernate.connection.provider_classorg.hibernate.connection.C3P0ConnectionProvider

 

 

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>

 

三、二級快取

Hibernate提供的快取

         有一級快取、二級快取。 目的是為了減少對資料庫的訪問次數,提升程式執行效率!

 

一級快取:

         基於Session的快取,快取內容只在當前session有效,session關閉,快取內容失效!

         特點:

                   作用範圍較小! 快取的事件短。

                   快取效果不明顯。

概述

二級快取:

         Hibernate提供了基於應用程式級別的快取, 可以跨多個session,即不同的session都可以訪問快取資料。 這個換存也叫二級快取。

         Hibernate提供的二級快取有預設的實現,且是一種可插配的快取框架!如果使用者想用二級快取,只需要在hibernate.cfg.xml中配置即可;不想用,直接移除,不影響程式碼。

         如果使用者覺得hibernate提供的框架框架不好用,自己可以換其他的快取框架或自己實現快取框架都可以。

        

使用二級快取

檢視hibernate.properties配置檔案,二級快取如何配置?

 

##########################

### Second-level Cache ###

##########################

 

#hibernate.cache.use_second_level_cachefalse【二級快取預設不開啟,需要手動開啟】

#hibernate.cache.use_query_cache true      【開啟查詢快取】

 

## choose a cache implementation                   【二級快取框架的實現】

 

#hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider

#hibernate.cache.provider_classorg.hibernate.cache.EmptyCacheProvider

hibernate.cache.provider_classorg.hibernate.cache.HashtableCacheProvider 預設實現

#hibernate.cache.provider_classorg.hibernate.cache.TreeCacheProvider

#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider

#hibernate.cache.provider_classorg.hibernate.cache.SwarmCacheProvider

 

二級快取,使用步驟

1) 開啟二級快取

2)指定快取框架

3)指定那些類加入二級快取

4)測試

         測試二級快取!

 

快取策略

 

<class-cacheusage="read-only"/>     放入二級快取的物件,只讀;

         <class-cacheusage="nonstrict-read-write"/> 非嚴格的讀寫

         <class-cacheusage="read-write"/>    讀寫; 放入二級快取的物件可以讀、寫;

         <class-cacheusage="transactional"/>   (基於事務的策略)

 

 

集合快取

<!-- 集合快取[集合快取的元素物件,也加加入二級快取] -->

      <collection-cache

usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>

 

查詢快取

list() 預設情況只會放入快取,不會從一級快取中取!

   使用查詢快取,可以讓list()查詢從二級快取中取!

 

 

完整案例:

Hibernate.cfg.xml

<!--****************** 【二級快取配置】****************** -->

        <!-- a.  開啟二級快取 -->

        <property name="hibernate.cache.use_second_level_cache">true</property>

        <!-- b. 指定使用哪一個快取框架(預設提供的) -->

        <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

        <!-- 開啟查詢快取 -->

        <property name="hibernate.cache.use_query_cache">true</property>

        <!-- c. 指定哪一些類,需要加入二級快取 -->

        <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/>

        <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/>

        <!-- 集合快取[集合快取的元素物件,也加加入二級快取] -->

        <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>

       

App  測試類

 

publicclass App {

   

    privatestatic SessionFactory sf;

    static {

        sf = new Configuration()

            .configure()

            .addClass(Dept.class)  

            .addClass(Employee.class)   // 測試時候使用

            .buildSessionFactory();

    }

    // 1. 測試二級快取的使用

    // 沒有/有用二級快取

    @Test

    publicvoid testCache() {

        Session session1 = sf.openSession();

        session1.beginTransaction();

        // a. 查詢一次

        Dept dept = (Dept) session1.get(Dept.class, 10);

        dept.getEmps().size();// 集合

        session1.getTransaction().commit();

        session1.close();

       

        System.out.println("------");

       

        // 第二個session

        Session session2 = sf.openSession();

        session2.beginTransaction();

        // a. 查詢一次

        dept = (Dept) session2.get(Dept.class, 10);  // 二級快取配置好;這裡不查詢資料庫

        dept.getEmps().size();

       

        session2.getTransaction().commit();

        session2.close();

    }

   

   

    @Test

    publicvoid listCache() {

        Session session1 = sf.openSession();

        session1.beginTransaction();

        // HQL查詢  setCacheable  指定從二級快取找,或者是放入二級快取】

        Query q = session1.createQuery("from Dept").setCacheable(true);

        System.out.println(q.list());

        session1.getTransaction().commit();

        session1.close();

       

       

        Session session2 = sf.openSession();

        session2.beginTransaction();

        q = session2.createQuery("from Dept").setCacheable(true);

        System.out.println(q.list());  // 不查詢資料庫:需要開啟查詢快取

        session2.getTransaction().commit();

        session2.close();

    }

}