国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Hibernate性能優化之EHCache緩存

2019-11-15 00:47:00
字體:
來源:轉載
供稿:網友
Hibernate性能優化之EHCache緩存

像Hibernate這種ORM框架,相較于JDBC操作,需要有更復雜的機制來實現映射、對象狀態管理等,因此在性能和效率上有一定的損耗。

在保證避免映射產生低效的SQL操作外,緩存是提升Hibernate的關鍵之一。

加入緩存可以避免數據庫調用帶來的連接創建與銷毀、數據打包拆包、SQL執行、網絡傳輸,良好的緩存機制和合理的緩存模式能帶來性能的極大提升,EHCache就提供了這種良好的緩存機制。

在考慮給系統加入緩存進行優化前,復用sessionFactory是Hibernate優化最優先、最基礎的性能優化方法,參考上一篇《Hibernate性能優化之SessionFactory重用》。

Hibernate的緩存機制


緩存的級別一般分為三種,每一種緩存的范圍更大:

事務級緩存:Hibernate中稱為一級緩存,在一個Session中共享緩存對象;

應用級緩存:Hibernate中稱為二級緩存,在一個SessionFactory中共享緩存對象,SessionFactory在整個應用范圍內重用;

分布式緩存:部署為單獨的實例,如Redis、Memcache等。

Hibernate的按以下方式進行緩存:

當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;

查不到,如果配置了二級緩存,那么從二級緩存中查;

如果都查不到,再查詢數據庫,把結果按照ID放入到緩存刪除、更新、增加數據的時候,同時更新緩存。

Hibernate默認不啟用二級緩存,EHCache是Hibernate中的二級緩存插件,使用Hibernate的系統可以直接使用EHCache緩存。

為什么要直接使用EHCache


回頭來看那句話:良好的緩存機制和合理的緩存模式能帶來性能的極大提升。

Hibernate的緩存模式是什么?

根據ID來緩存對象,也就是Session的get、load操作時。

這種緩存模式的弊端有兩點:

1、應用場景太單一,系統中大量的列表式查詢緩存起不到作用;

2、一些系統中通過ThreadLocal在線程中重用Session,每個線程可能需要大量處理不用的業務邏輯,緩存命中率很低;如果不重用Session,一般的場景緩存命中率更低。

既然EHCache已經提供了良好的緩存機制,結合自己系統的業務來優化緩存模式才是最佳的。

如何使用EHCache


EHCache是Hibernate中的二級緩存插件,使用Hibernate的系統可以直接使用EHCache緩存,不需要再添加其他jar包。

新建EHCache配置文件,具體的配置含義可以查手冊:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:noNamespaceSchemaLocation="ehcache.xsd">    <diskStore path="java.io.tmpdir"/>    <defaultCache      maxElementsInMemory="10000"      maxElementsOnDisk="0"      eternal="true"      overflowToDisk="true"      diskPersistent="false"      timeToIdleSeconds="0"      timeToLiveSeconds="0"      diskSpoolBufferSizeMB="50"      diskExpiryThreadIntervalSeconds="120"      memoryStoreEvictionPolicy="LFU"      />    <cache name="restCache"      maxElementsInMemory="100"      maxElementsOnDisk="0"      eternal="false"      overflowToDisk="false"      diskPersistent="false"      timeToIdleSeconds="119"      timeToLiveSeconds="119"      diskSpoolBufferSizeMB="50"      diskExpiryThreadIntervalSeconds="120"      memoryStoreEvictionPolicy="FIFO"      />  </ehcache>  

EHCache的一個優點是線程安全的,適合多線程的使用場景,能簡化開發人員的使用。

因此我寫了一個單例模式,避免每次在方法里寫getCache,這個類也涵蓋了EHCache的基本使用:

public class EHCacheFactory {        PRivate final CacheManager manager;    private final Cache cache;        private EHCacheFactory() {        manager = CacheManager.create(getClass().getResource("/ehcache.xml"));        cache = manager.getCache("restCache");    }        public Element getCache(String strKey) {        return EHCacheFactory.getInstance().getCache().get(strKey);    }        public void setCache(String strKey, String strVal) {        EHCacheFactory.getInstance().getCache().put(new Element(strKey, strVal));    }        public Cache getCache() {        return cache;    }        private static class SingletonHolder {        private final static EHCacheFactory INSTANCE = new EHCacheFactory();    }    public static EHCacheFactory getInstance() {        return SingletonHolder.INSTANCE;    }}

我的系統是JAVA REST,在需要緩沖的REST接口中加入了EHCache緩存,通過URL參數作為緩存鍵值,REST接口返回的json數據作為緩存值,這種緩存模式非常適合REST。

使用ab進行了簡單的性能測試:

在一個簡答查詢接口中,性能提升一倍;

在一個略復雜接口中,執行4、5個查詢,加入緩存后性能提升20倍。

在這里就不貼ab測試結果了,大家可以自行測試一下。


記錄,為更好的自己!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 房产| 达州市| 当雄县| 神农架林区| 湘潭县| 霍城县| 北宁市| 南丰县| 策勒县| 锦屏县| 突泉县| 泸水县| 唐海县| 汕头市| 如皋市| 黄梅县| 遂溪县| 昭通市| 辛集市| 道真| 普宁市| 鄂伦春自治旗| 东方市| 广昌县| 湖北省| 昆山市| 通山县| 城口县| 崇礼县| 太和县| 乳源| 濮阳县| 怀化市| 靖西县| 宜黄县| 博野县| 漳州市| 禄丰县| 桃园县| 长乐市| 洪湖市|