緩存:sql
緩存就是數據庫數據在內存中的臨時容器,包括數據庫數據在內存中的臨時拷貝,它位於數據庫與數據庫訪問中間層,ORM在查詢數據時,首先會根據自身的緩存管理策略,在緩存中查找相關數據,若是發現所需的數據,則直接將此數據做爲結果加以使用,從而避免數據庫調用性能的開銷,而相對內存操做而言,數據庫調用是一個代價高昂的過程。數據庫
查找數據時,先去緩存中查找是否有此數據,若是有此數據,則直接使用緩存中的數據,再也不從數據庫中查詢,不然去數據庫中查詢,減小與數據庫的交互。緩存
Hibernate緩存包括兩大類:一級緩存和二級緩存session
Hibernate一級緩存又被稱爲「Session的緩存」。Session緩存是內置的,不能被卸載,是事務範圍的緩存,在一級緩存中,持久化類的每一個實例都具備惟一的OID。
Hibernate二級緩存又稱爲「SessionFactory的緩存」,因爲SessionFactory對象的生命週期和應用程序的整個過程對應,所以Hibernate二級緩存是進程範圍或者集羣範圍的緩存,有可能出現併發問題,所以須要採用適當的併發訪問策略,該策略爲被緩存的數據提供了事務隔離級別,第二級緩存是可選的,是一個可配置的插件,默認下SessionFactory不會啓用這個插件。併發
一級緩存(Session):性能
第一次經過id=1獲取對象的時候,session中是沒有對應緩存對象的,因此會在"log1"後出現sql查詢語句。
第二次經過id=1獲取對象的時候,session中有對應的緩存對象,因此在"log2"後不會出現sql查詢語句spa
二級緩存(SessionFactory):hibernate
hibernate自己不提供二級緩存,都是使用第三方的二級緩存插件,這裏使用的是 EhCache提供的二級緩存, 在hibernate.cfg.xml中開啓二級緩存的配置插件
使用不一樣的session,都去獲取id=1的category,只會訪問一次數據庫。xml
由於第二次獲取雖然沒有從第二個session中拿到緩存,可是從sessionfactory中拿到了Category緩存對象
ehcache.xml配置文件
result: