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 的快取是一種分散式的,可以讓不同主機上的多個使用者同時訪問, 因此解決了共享記憶體只能單機應用的侷限,更
mybatis和hibernate的一級、二級快取
MyBatis一級快取: hibernate一級快取: 基本差不多 HashMap本地快取,作用域為session,session級別的快取,通過get,update可以將物件放到一級快取中,當 Session flush 或 close&n
hibernate ehcache 二級快取
為什麼需要快取 拉高程式的效能 關係型資料庫:資料與資料之間存在關係(聯絡)的資料庫 mysql/Oracle、sqlserver 非關係型資料庫:資料與資料之間是不存在關係的,key-value 1、基於檔案儲存的資料庫:ehcache 2、基於記憶體儲存的資料庫:redis、m
Mybatis和hibernate的一級,二級快取問題
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的二級快取機制。這個看起