【Hibernate框架開發之九】Hibernate 性能優化筆記!(遍歷、一級/二級/查詢/緩存/樂觀悲觀鎖等優化算法)...

1. ? 循環分頁或者循環進行部分讀取處理數據的時候,使用 session.clear() ;

?

2. ? ?對應1+N(N+1)問題使用如下解決方式:

1): 使用createCriteria進行查詢(join fetch)

2):HQL -> join fetch

3): 使用@fetch設置LAZY

4):在@Entity下使用注解@BatchSize(size=5)

@BatchSize ?指定每次 讀 取數據的數量

?

3. List 與 iterate 進行遍歷取出數據庫數據的list();

區別1)List 直接取出對象 ? ? ??iterate先會取出組件,需要使用才會使用

?

區別2)同一個session中每次執行list()取出數據時都會發送SQL語句,但是iterate只會發出一條,默認會去session緩存去找;

?

4. 緩存,session級別的緩存稱為一級緩存,每個session都有獨立的一級緩存,例如多個線程同時取同一個對象數據;

解決方案:建立一個共用的總緩存(總緩存)二級緩存,如果找不到然后再到各自的session一級混村中尋找;具體操作如下:首先看緩存策略,

type : 其中memory支持緩存內存中,disk支持緩存存放硬盤中;

Cluster Safe :是否支持使用在集群環境;

Query Cache Supported:是否支持查詢緩存(3級緩存)

假設使用EhCacheProvider二級緩存:

1)修改hibernate.cfg.xml配置文件:

?
1
2
<property?name="cache.use_second_level_cache">true</property>
<property?name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

2) 在/hibernate-distribution-3.3.2.GA/project/etc/ehcache.xml 配置文件拷貝到項目中;

在ehcache.xml中默認如下設置:

?
1
?<diskStore?path="java.io.tmpdir"/>
?
1
2
3
4
5
6
7
<defaultCache
???maxElementsInMemory="10000"
???eternal="false"
???timeToIdleSeconds="120"
???timeToLiveSeconds="1200"
???overflowToDisk="true"
???/>

maxElementsInMemory:在內存中最多緩存的對象數量

eternal: 緩存內存對象是否永久保存不刪除

timeToIdleSeconds: ?當timeToIdleSeconds 周期時間沒有被使用過,自動清除掉;(秒)

timeToLiveSeconds: 緩存對象的生存時間(秒)后自動清楚;

overflowToDisk:溢出的時候是否放置在硬盤上

diskStore ?path:默認臨時存放硬盤緩存的路徑

注意:<cache name="sampleCache1" ? ?/> 可以自定義cache名,不自定義不指定默認是用 <defauleCache ? ..... />

3)將類使用二級緩存,直接在@Entity下使用注解 ? ?@Cache ?其設置如下:

常用的READ_ONLY (只讀),?READ_WRITE(讀寫)

其中@Cache(region="") 使用自定義ehcache.xml的自定義緩存策略設置 ~

4)加入ehcache的jar包,路徑如下:/hibernate-distribution-3.3.2.GA/lib/optional/ehcache/ehcache.jar

加入?commons-logging.jar包

? ? ? ? ? ? ?1. ? ?放入二級緩存如下規則:

? ? ? ? ? ? ? ? ? ?a) ? 經常訪問 ?b) 不經常改動(改動不大) c) 數據不是很大?例如用戶權限;

2. ? ? load 默認使用二級緩存,iterate 默認使用二級緩存

3. list 默認往二級緩存加數據,list查詢的使用不使用緩存

4. 如果要 query 查詢語句使用二級緩存,需要打開查詢緩存(同樣的重復的查詢!)

1) hibernate.cfg.xml配置文件加入配置:

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

2) 使用Query的setCachable(true) 方法指明使用二級緩存 ;

?

5. ? ?緩存算法:LRU 、 LFU 、 FIFO

LRU: 最近最少被使用的; (時間)

LFU: 使用率比較少的;(次數)

FIFO:按照數據從0開始拿走(堆棧)

設置方法:在ehcache.xml繼續設置一個參數: memoryStoreEvictionPolicy="LRU"

?

6. 事務隔離機制(為了避免事務并發出現的問題)

1. read-uncommitted : 能讀取沒有提交的數據; 【會出現臟讀等問題,一般不設置此種】

2. read-committed : ?只有提交后才讀;Hibernate建議使用!【能解決臟讀但會出現不可重復讀和幻讀問題(手動解決)】

3. repeatable read : ? ? ?加鎖;(MySQL默認使用?repeatable read?

4. serializable : ? 序列化,解決任何問題,但是效率最低;

MySQL?支持這四種事務隔離機制;?事務隔離級別越高效率越慢~

使用 select @@tx_isolation; ?查詢事務隔離機制;

? ? ?設置隔離機制:?set session tx_isolation='xxx'; ?

?

Hibernate解決并發事務方案:使用Hibernate悲觀鎖和樂觀鎖進行設置;

1)事務機制的值為1,2,4,8 (ps. 二進制為0001 ,0010,0100,1000 這樣算法效率高)

1.a)使用悲觀鎖:(依賴于數據庫的鎖 解決 repeatable read問題)

在讀取load數據的時候,加入第三個參數::

session.load(xxx.class, 1,LockMode.xxx);

LockMode的值如下:

一般只設置LockMode.UPGRADE

原因:

NONE: 無鎖的機制,Transaction結束時切換到此模式;

READ :在查詢的時候 hibernate會自動獲取鎖;

write ,insert, update hibernate 會自動獲取鎖;

以上 3種鎖的模式是hibernate內部使用的;

UPGRADE—NOWAIT ->是oracle數據庫 支持的鎖;

?

? ? ?1.b)使用樂觀鎖:(程序內使用字段version進行加鎖,與數據庫沒有關系)

可以定義一個version屬性,然后在getVersion上使用注解 @Version

注意:當并發的時候會報錯,那么找個錯誤交給我們自己來處理; ?

? ? ? ?悲觀與樂觀:悲觀一開始就進行加鎖,不論是否有其他事務來同時并發;但是樂觀鎖則不進行直接加鎖,而是等待更新時候進行檢查對比下,如果與去之前version不一致那么更新下即可;樂觀鎖效率高;





本文轉自 xiaominghimi 51CTO博客,原文鏈接:http://blog.51cto.com/xiaominghimi/969788,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453939.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode中安裝webpack_VSCode下手動構建webpack項目(示例代碼)

1.執行npm install nrm -g&#xff0c;安裝nrm&#xff0c;此模塊主要用于切換npm鏡像源&#xff0c;簡化手動配置步驟2.執行 nrm ls&#xff0c;可以看到npm源地址列表&#xff0c;當前使用的是默認源&#xff0c;npm https://registry.npmjs.org/3.執行 nrm use taobao&#…

Python html 代碼轉成 word(docx)

安裝 sudo apt install pandoc pip3 install pypandoc示例代碼 import pypandochtml """ <h3>This is a title</h3> <p><img src"http://placehold.it/150x150" alt"I go below the image as a caption"></p…

最新ffmpeg編譯和用eclipse進行源碼調試

最近由于項目需要&#xff0c;必須修改ffmpeg的源碼進行修改才能滿足項目的需求&#xff0c;但以前我從來沒有自己去編譯和使用ffmpeg的源代碼&#xff0c;一直都是用別人編譯好了的sdk&#xff0c;再加上習慣了vs方便的編譯環境&#xff0c;要在linux下對如此多的源代碼進行編…

Django補充知識點——用戶管理

內容概要 1、Form表單2、Ajax3、布局&#xff0c;Django母板4、序列化5、Ajax相關6、分頁7、XSS攻擊8、CSRF9、CBV、FBV 10、類中用裝飾器的兩種方法 11、上傳文件 12、數據庫正向查詢、反向查詢、多對多查詢 13、jQuery對象和DOM對象可以互相轉換 14、cookie和session 用戶管理…

easypoi導出excel 效率_Spring Boot 入門(十二):報表導出,對比poi、jxl和esayExcel的效率...

關于poi、jxl和esayExcel的介紹自行百度。jxl最多支持03版excel&#xff0c;所以單個sheet頁面最多只能導出65536條數據。我直接將excel導入到瀏覽器并打開&#xff0c;以下統計導出時長指將數據從數據庫查詢&#xff0c;并寫入到excel的過程。不包括打開excel所消耗的時間為了…

Python html 代碼轉成圖片、PDF

一、下載 1、python的imgkit、pdfkit庫 pip install imgkit pip install pdfkit 2、wkhtmltopdf工具包 下載地址&#xff1a;https://wkhtmltopdf.org/downloads.html 下載之后安裝&#xff0c;安裝完成會生成兩個程序&#xff0c;分別用來轉圖片和pdf&#xff1a; 二、使…

SpringEL expression:

2019獨角獸企業重金招聘Python工程師標準>>> 這個異常有下面幾種情況 1、你寫的 EL 表達式有語法錯誤。 2、再者就是你取得變量是多級的話比如 student.address.prevince 屬性model 關聯有問題。 3、還有就是你取得值為空&#xff08;null&#xff09; 比如 Thymel…

利用qt和ffmpeg軟件來制作視頻裁剪工具

0 什么是ffmpeg? Libav&#xff08;舊稱&#xff1a;FFmpeg&#xff09;是一個自由軟件&#xff0c;可以運行音頻和視頻多種格式的錄影、轉檔、流功能[1]&#xff0c;包含了libavcodec ─這是一個用于多個專案中音頻和視頻的解碼器庫&#xff0c;以及 libavformat ——一個音頻…

fresco使用中圓角出現了黑邊

其實并不是出現了黑邊&#xff0c;而是圖片上有顏色滲出 如何修改 在xml加入 fresco:roundWithOverlayColor "color/transparent" //就是把圓角覆蓋圖改為透明色 轉載于:https://www.cnblogs.com/vete-l/p/7998122.html

Python 第三方庫之 docxtpl (處理word文檔)

項目官方文檔 項目官方git docxtpl 軟件包使用兩個主要軟件包&#xff1a; python docx&#xff0c;用于讀取、寫入和創建子文檔jinja2用于管理插入到模板docx中的標記。jinja官網, jinja中文網站 簡單示例 from docxtpl import DocxTemplatetpl DocxTemplate(test.docx)con…

域添加另一臺機器_巨杉Tech | SequoiaDB數據域概念解讀與實踐

近年來&#xff0c;銀行各項業務發展迅猛&#xff0c;客戶數目不斷增加&#xff0c;后臺服務系統壓力也越來越大&#xff0c;系統的各項硬件資源也變得非常緊張。因此&#xff0c;在技術風險可控的基礎上&#xff0c;希望引入大數據技術&#xff0c;利用大數據技術優化現有IT系…

Citrix XenServer 池要求

池要求 資源池是一臺或多臺服務器的同類或異類聚合&#xff0c;每個池最多包含 16 臺服務器。創建池或將服務器加入現有池前&#xff0c;應確保池中的所有服務器滿足下面介紹的要求。 硬件要求 XenServer 資源池中的所有服務器必須具有廣泛兼容的 CPU&#xff0c;也就是說&…

推薦一個接口文檔工具

ShowDoc 轉載于:https://www.cnblogs.com/LW-baiyun/p/8003975.html

自動轉換flv文件

在線轉化.誰有 把其他的視頻文件格式的視頻,經過上傳自動轉化FLV格式的一種插件.提供編程接口.給我一份.類似新浪網播客上傳視頻的一樣. (還有上傳是的哪個效果,進度條如何作的?)或者給我個參考地址什 ... 環境&#xff1a;redhat as41。首先獲取ffmpeg很多人找不到怎么下載,其…

云計算的概念_云計算概念掀起漲停潮 美利云奠定板塊龍頭地位

溫馨提示&#xff1a;股市風險時刻存在&#xff0c;文中所提個股僅為個人觀點&#xff0c;請勿盲目跟隨操作&#xff0c;筆者希望大家都做到不貪婪&#xff0c;不恐懼&#xff0c;不瞎猜&#xff0c;不跟風做一個紀律嚴明輕松淡定的股票交易者。社4月26日訊&#xff0c;滬深兩市…

Python 第三方模塊之 PDFMiner(pdf信息提取)

PDFMiner簡介 pdf提取目前的解決方案大致只有pyPDF和PDFMiner。據說PDFMiner更適合文本的解析&#xff0c;首先說明的是解析PDF是非常蛋疼的事&#xff0c;即使是PDFMiner對于格式不工整的PDF解析效果也不怎么樣&#xff0c;所以連PDFMiner的開發者都吐槽PDF is evil. 不過這些…

TFS2017持續發布中調用PowerShell啟停遠程應用程序

目前團隊項目中有多個Web、服務以及與大數據平臺對接接口等應用&#xff0c;每次的發布和部署采用手工的方式進行。停止應用程序&#xff0c;拷貝發布包&#xff0c;啟動應用程序&#xff0c;不停的循環著&#xff0c;并且時不時地會出現一些人為錯誤性問題。這種模式消耗的很多…

Flask 多線程

參數 app.run()中可以接受兩個參數&#xff0c;分別是threaded和processes&#xff0c;用于開啟線程支持和進程支持。 threaded&#xff1a; 是否開啟多線程&#xff0c;默認不開啟。 if __name__ __main__:app.run(threadedTrue)processes&#xff1a;進程數量&#xff0c…

40天python入門教程_Python入門教程超詳細1小時學會Python

Java和Javascript,不用1小時你就可以用Python快速流暢地寫有用的Python程序.為什么使用Python假設我們有這么一項任務:簡單測試局域網中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windo…

基于LVS對LAMP做負載均衡集群

一、簡介 LVS是Linux Virtual Server的簡稱&#xff0c;也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目&#xff0c;它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分&#xff0c;在Linux2.4內核以前&#xff0c;使用LVS時必須要…