hibernate中數據庫的優化

三、list和iterate不一樣算法

a)list取全部數據庫

b)literate先取ID,等到用的時候根據ID取對象緩存

c)session中list第二次發出,仍會到數據庫查詢。session

d)iterate第二次,先找session級緩存。併發

四、一級緩存和二級緩存和查詢緩存spa

a)什麼是緩存hibernate

能夠在內存中開闢一塊空間,把原本在數據庫中讀的東西 放在內存中,這樣讀的時候直接從內存中讀取。xml

b)一級緩存對象

session級別的緩存。一個session不能取另外一個session的內容。事務

c)二級緩存

sessionFactory級別的緩存

弄一個大的緩存,把全部的session所有放在裏面

適合場景:

常常被訪問,改動不大,數量有限。好比用戶的權限,組織機構。

用法:在須要接入緩存的類的上面加@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)//表示既能讀也能改

loadt默認使用二級緩存,iterate默認使用二級緩存

d)查詢緩存

list默認使用二級緩存加數據,可是查詢的時候不用,也就是說,在內存中有對象,可是會去從數據庫中查詢。

緣由是每次執行query查詢的時候可能語句不同,或許查詢的數據部分不在緩存中。若是第一次查的語句和第二次

查的同樣,會去內存中查,這就是查詢緩存。

使用方法:

i.在配置hibernate.cfg.xml中加入

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

固然緩存的配置中必須開啓緩存。

ii.session.createQuery("").setChacheable(true).list();

iii.若是使用兩次session,不會發出兩條查詢語句,則證實查詢緩存開啓。

e)緩存算法

內存裏的對象一旦滿了,新來的對象會把哪一個對象替換掉?

LRU,LFU,FIFO

LRU:Least Recently Used,最近不多被使用。

LFU:Least Frequently Used ,最近使用頻度最低替換, 好比說最近訪問100次,哪一個命中率最低,哪一個被替換掉。

FIFO:First In First Out ,誰先進來誰先出去。

設置:

ehcache.xml中在<cache>標籤中設置memoryStoreEvictionPolicy=」LRU「

五、事務的併發處理

a)什麼是事務?

要麼都完成,要麼都不完成。

b)常見特性:具備ACID特性

i.原子性

ii.一致性

iii.獨立性

iv.持久性

c)事務併發可能出現的問題

i.第一類丟失更新(數據庫只要支持事物,這個問題就能夠解決)

ii.髒讀(*)

讀了別的事務沒有提交的數據

iii.不可重複讀(*)(用在更新操做)

同一個事物先後讀的數據不同,被另外一個事務影響了。

iv.第二類丟失更新(不可重複讀的特殊狀況)

v.幻讀(插入和刪除的操做)(*)

同一個事務先後讀的數據不同,被另外一個事務影響了,在讀的過程當中,

另一個事務可能插入一條新的紀錄。

d)解決方案

i.讓它不要併發

數據庫的事務隔離機制

MySQL中查詢事務機制:select @@tx_isolation.

serial解決一切問題,可是不設這個級別,當檢查問題時纔會使用。

咱們通常使用的是read-committed,避免髒讀,併發性也比較好,經過其餘手段

設定hibernate的事務隔離級別

hibernate.connection.isolation=2

可是這樣作仍是會出現不可重複讀,幻讀的問題

ii.在hibernate中使用悲觀鎖解決repeatable read 的問題(依賴於數據庫的鎖)

通常狀況下查詢總數,不會在一個session中查詢,因此暫時不用解決幻讀的問題,

實際應用中不太用到悲觀鎖。

iii.在load第三個參數中加LockMode.UPGRADE

iv.悲觀鎖是爲了防止別人修改,直接加把鎖,樂觀鎖是設置字段,先後進行對比,查看

是否一致,若是一致,則證實沒有被改過,若是不一致,則進行響應的處理。

v.樂觀鎖的實現

增長@version註解,若是有人更新,則會報錯,而後根據須要作出相應的解決。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息