1. 程式人生 > >memcached分散式快取和hibernate結合-- Hibernate+ehcache二級快取技術

memcached分散式快取和hibernate結合-- Hibernate+ehcache二級快取技術

Memcached是由Danga Interactive開發的,高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached 的快取是一種分散式的,可以讓不同主機上的多個使用者同時訪問, 因此解決了共享記憶體只能單機應用的侷限,更不會出現使用資料庫做類似事情的時候,磁碟開銷和阻塞的發生。
memcached的使用
一 
Memcached伺服器端的安裝 (此處將其作為系統服務安裝)
  下載檔案:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
   1 解壓縮檔案到c:\memcached
   2 命令列輸入 'c:\memcached\memcached.exe -d install' 
   3 命令列輸入 'c:\memcached\memcached.exe -d start' ,該命令啟動 Memcached ,預設監聽埠為 11211
  通過 memcached.exe -h 可以檢視其幫助

問題

  如果沒有下載伺服器端(如果memcached的使用)開啟memcached服務的話,那麼將出現一系列的錯誤,最主要是報連線的問。所以大家在使用memcached的時候一定要安裝伺服器端。

memcached和Hibernate的結合

現在Hibernate實現了memcached的無縫連線,已經說過了,hibernate暴力的地方是他的快取,hibernate結合memcached也是相當方便,只需配置,啟動伺服器沒有錯誤算配置OK啦。去在網上看了一大堆關於hibernate和memcached結合的文章,文章內容基本上都是一致的,鬱悶死,參考價值就少了很多。本人公司正使用memcached作為Hibernate的二級快取,在這裡也整理一下相關的內容。

  hibernate的快取機制是其成為主流持久層霸主地位的重要組成部分,他的快取機制是很黃很暴力的。二級快取是SessionFactory級別的全域性快取,可以通過配置檔案的hibernate.cache.provider_class 進行指定。在上次的日誌上有提到相關的配置,在這裡我再次貼一次供需要的人瞭解。

hibernate.cfg.xml

程式碼

 <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  <hibernate-configuration>
  <session-factory name="default"> 
   <property name="hibernate.show_sql">true</property>
   <property name="hibernate.format_sql">true</property>
   <property name="hibernate.hbm2ddl.auto">update</property>
   <!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> -->
   <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
   <property name="hibernate.jdbc.fetch_size">50</property>
   <property name="hibernate.jdbc.batch_size">0</property>
   <property name="hibernate.default_schema">user</property>
    
      <!-- hibernate-memcache配置-->
      <!-- 開啟二級快取-->  
     <property name="hibernate.cache.use_second_level_cache">  
         true   
     </property>  
     <!-- 設定快取類-->  
     <property name="hibernate.cache.provider_class">com.googlecode.hibernate.memcached.MemcachedCacheProvider</property>  
     <!-- 設定memcache快取伺服器埠 -->  
     <property name="hibernate.memcached.servers">localhost:11211</property>  
     <!-- 設定二級快取的字首名稱 -->  
     <property name="hibernate.cache.region_prefix">quality.cache.ehcache</property>  
     <!-- 否使用結構化的方式快取物件  -->  
     <property name="hibernate.cache.use_structured_entries">true</property>  
     <!-- 是否快取查詢結果 -->  
     <property name="hibernate.cache.use_query_cache">true</property>  
 
   <mapping resource="com/weiruan/projs/mydc/pojos/Usert.hbm.xml"/>
   <mapping resource="com/weiruan/projs/mydc/pojos/Developer.hbm.xml"/>
  </session-factory>
  </hibernate-configuration>

依賴的包:hibernate-memcache.jar,memcached-2.3.1.jar、spy2.4、slf4j-1.5.0.jar、slf4j-log4j12-1.5.0.jar還有一個hibernate-memcached[版本].jar,下載地址:http://code.google.com/p/hibernate-memcached/downloads/list

1、首先設定EhCache,建立配置檔案ehcache.xml,預設的位置在class-path,可以放到你的src目錄下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
 <diskStore path="java.io.tmpdir"/> 
  <defaultCache
   maxElementsInMemory="10000" <!-- 快取最大數目 -->
   eternal="false" <!-- 快取是否持久 -->
   overflowToDisk="true" <!-- 是否儲存到磁碟,當系統當機時-->
   timeToIdleSeconds="300" <!-- 當快取閒置n秒後銷燬 -->
   timeToLiveSeconds="180" <!-- 當快取存活n秒後銷燬-->
   diskPersistent="false"
   diskExpiryThreadIntervalSeconds= "120"/> 
</ehcache>

2、在Hibernate配置檔案中設定: 

<!-- 設定Hibernate的快取介面類,這個類在Hibernate包中 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
 <!-- 是否使用查詢快取 -->
 <property name="hibernate.cache.use_query_cache">true</property>
  如果使用spring呼叫Hibernate的sessionFactory的話,這樣設定:
  <!--HibernateSession工廠管理 -->
   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref bean="datasource" />
   </property>
   <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
    <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
   </props>
 </property>
 <property name="mappingDirectoryLocations">
  <list>
   <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
  </list>
 </property> 
</bean>

說明一下:如果不設定“查詢快取”,那麼hibernate只會快取使用load()方法獲得的單個持久化物件,如果想快取使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的資料結果集的話,就需要設定 
hibernate.cache.use_query_cache true 才行 

3、在Hbm檔案中新增<cache usage="read-only"/> 

4、如果需要“查詢快取”,還需要在使用Query或Criteria()時設定其setCacheable(true);屬性 

5、實踐出真知,給一段測試程式,如果成功的話第二次查詢時不會讀取資料庫 

package cn.rmic.hibernatesample;
import java.util.List;


import org.hibernate.CacheMode;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;


import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
import cn.rmic.manager.po.Resources;


public class testCacheSelectList ...{


 /** *//**
 * @param args
 */
 public static void main(String[] args) ...{
  // TODO Auto-generated method stub


  Session s=HibernateSessionFactory.getSession();
  Criteria c=s.createCriteria(Resources.class);
  c.setCacheable(true);
  List l=c.list();
  // Query q=s.createQuery("From Resources r")
  // .setCacheable(true) 
  // .setCacheRegion("frontpages") ;
  // List l=q.list();
  Resources resources=(Resources)l.get(0);
  System.out.println("-1-"+resources.getName());
  HibernateSessionFactory.closeSession();
  try ...{
   Thread.sleep(5000);
  } catch (InterruptedException e) ...{
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  s=HibernateSessionFactory.getSession();
  c=s.createCriteria(Resources.class);
  c.setCacheable(true);
  l=c.list();
  // q=s.createQuery("From Resources r").setCacheable(true) 
  // .setCacheRegion("frontpages");
  // l=q.list();
  resources=(Resources)l.get(0);
  System.out.println("-2-"+resources.getName());
  HibernateSessionFactory.closeSession();
 }


相關推薦

memcached分散式快取hibernate結合-- Hibernate+ehcache二級快取技術

Memcached是由Danga Interactive開發的,高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached 的快取是一種分散式的,可以讓不同主機上的多個使用者同時訪問, 因此解決了共享記憶體只能單機應用的侷限,更

mybatishibernate的一級、二級快取

MyBatis一級快取: hibernate一級快取: 基本差不多  HashMap本地快取,作用域為session,session級別的快取,通過get,update可以將物件放到一級快取中,當 Session flush 或 close&n

hibernate ehcache 二級快取

為什麼需要快取 拉高程式的效能 關係型資料庫:資料與資料之間存在關係(聯絡)的資料庫 mysql/Oracle、sqlserver 非關係型資料庫:資料與資料之間是不存在關係的,key-value 1、基於檔案儲存的資料庫:ehcache 2、基於記憶體儲存的資料庫:redis、m

Mybatishibernate的一級,二級快取問題

Mybatis .一級快取(sqlSession)     一級快取是SqlSession自帶的。SqlSession物件被建立,一級快取就存在了。     如果SqlSession物件關閉或呼叫清理方法,會導致快取失效。     快取底層實現就是通過HashMap實現的。

hibernate:真正理解二級快取查詢快取

public class Person { private Person parent; private Set<Person> children; public void setParent(Person p) { parent = p; } public void setChild

Hibernate JPA 中配置Ehcache二級快取

在Hibernate3 JPA裡配置了一下非分散式環境的二級快取,效果不錯。具體過程如下: 1, 需要引入的jar包       ehcache-core-2.4.6.jar (必需)       ehcache-terracotta-2.4.6.jar (

Hibernate 5.2.12 二級快取配置及案例

1,Hibernate 快取簡介        Hibernate中提供了 二級快取,一級快取是Session級別的快取,它屬於事物範圍的快取,該快取由Hibernate管理,程式無需干涉,二級快取是SessionFactory級別的快取該快取可以配置和更改,是一種可插配的

MemCache快取C#自帶的Cache快取

 1、MemCache //初始化 static SockIOPool _pool; // 建立Memcached private static MemcachedClient Create(string poolName) { CreateServer("abc11666", "12

使用Redis做快取資料庫來存放資料Mybatis自帶的二級快取,兩者相比各自有什麼優勢?

Redis方案:    1.擴充套件性號,資料量大的時候做主從複製,或者叢集來進行擴充套件。    2.不易丟失,可以週期性持久化。    3.降低風險,被快取的記憶體和應用程式的記憶體分開,有助於風險分攤。    4.靈活多變,對於快取失效和更新操作可自主控制。    5.

SpringMVC4.3+ hibernate5 整合EhCache 二級快取 給予java-config

1. sessionFactory 的配置 @Configuration //啟用註解事務管理,使用CGLib代理 @EnableTransactionManagement(proxyTargetClass = true) @Import({DataSourceCo

MyBatis 延遲載入,一級快取(sqlsession級別)、二級快取(mapper級別)設定

什麼是延遲載入          resultMap中的association和collection標籤具有延遲載入的功能。         延遲載入的意思是說,在關聯查詢時,利用延遲載入,先載入主資訊。使用關聯資訊時再去載入關聯資訊。 設定延遲載入      

MyBatis 快取機制深度解剖 / 自定義二級快取

感謝有奉獻精神的人 轉自:http://denger.iteye.com/blog/1126423/ 快取概述 正如大多數持久層框架一樣,MyBatis 同樣提供了一級快取和二級快取的支援;一級快取基於 PerpetualCache 的

memcached分散式快取hibernate結合

先了解一下什麼是memcached Memcached是由Danga Interactive開發的,高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached 的快取是一種分散式的,可以讓不同主機上的多個使用者同時訪問, 因此解決

hibernate--一級二級快取(使用Ehcache)以及查詢快取

有一下幾點需要理清才行: 一級快取是session快取 session關閉就小時 二級快取是sessionFactory級別的快取 一個應用程式只有一個 多個執行緒共享  不要把經常修改的物件放到二級快取中 二級快取中放一些查詢的物件 1 首先是在hibernate,cfg

Hibernate二級快取配置原理

hibernate 的快取分為三大類,一級快取,二級快取和查詢快取 一級快取是hiSession級別的快取/事物快取,二級快取是Sessionfactory級別的快取 一級快取可以經過Sessionimpl類的兩個方法可以看出 actionQueue它是一個行動佇列,它主要記錄crud操作的相關資

深入理解Hibernate的一級快取快照

hibernate分為: 一級快取也就是 Session 級別的快取,它是屬於事務範圍的快取 二級快取也就是 SessionFactory 級別的快取,它是屬於程序範圍的快取 session的一級快取 使用hibernate進行查詢的時候,將查詢結果放置到session的一級快取中,在一級快

hibernate學習篇——二級快取,hibernate 整合ehcache

1.為什麼需要快取 把很少被修改或根本不改的資料快取,提高程式的效能 2.資料庫型別 關係型資料庫:資料與資料之間存在關係(聯絡)的資料庫 mysql/Oracle、sqlserver 非關係型資料庫:資料與資料之間是不存在關係的,key-value 1、基於檔案儲存的資料庫:ehcac

Hibernate總結--一級快取二級快取

在Hibernate中存在一級快取和二級快取,一級快取時Session 級別的快取,它是屬於事務範圍的快取,這一級別的快取由 hibernate 管理的。一級快取Hibernate預設會實現,當使用get或者load等方式查詢時會將結果存在Session中,在下一次查詢時。若是同一個Session,

Hibernate 二級快取查詢快取

一級快取:     1,在session上面有一個一級快取;一級快取的生命週期和session相同,一級快取最大生命週期就是一個執行緒;在web環境下面,session的最大生命週期就是一次請求;     2,一級快取可以用來幹嘛? &nb

hibernate 二級快取事務級別詳講

一、概述 這章總的分兩大塊來講解   第一大塊,hibernate的事務管理。對於hibernate的事務管理來說,如果之前學過資料庫的事務管理,那麼在這裡就順風順水了。如果沒學過,第一次遇到,那也沒關係,我會詳細解釋其中的內容。   第二大塊,hibernate的二級快取機制。這個看起