hibernate學習 六 Hibernate緩存
緩存:
如果在集群環境下使用Hibernate時,(集群有節點A ,節點B) 當請求,發往A節點,A在數據庫中修改了一條記錄,然後節點B的緩存中如何實時的更新節點A修改的新數據
hibernate本身的一級緩存不能跨越進程, 需要第三方緩存的支持, Ehcache緩存就可以實現
Hibernate緩存:
一級緩存:
在同一個Session裏面,第一次調用get()方法, Hibernate先檢索緩存中是否有該查找對象,發現沒有,Hibernate發送SELECT語句到數據庫中取出相應的對象,然後將該對象放入緩存中,以便下次使用,第二次調用get()方法,Hibernate先檢索緩存中是否有該查找對象,發現正好有該查找對象,就從緩存中取出來,不再去數據庫中檢索,沒有再次發送select語句。
一個session不能取另一個session中的緩存。
二級緩存:
SessionFactory級別的緩存,可以跨越Session存在,可以被多個Session所共享。
(1)經常被訪問
(2)改動不大
(3)數量有限
(4)不是很重要的數據,允許出現偶爾並發的數據。
用戶的權限:用戶的數量不大,權限不多,不會經常被改動,經常被訪問。例如組織機構。
Hibernate查找對象如何應用緩存?
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;
查不到,如果配置了二級緩存,那麽從二級緩存中查;
如果都查不到,再查詢數據庫,把結果按照ID放入到緩存, 刪除、更新、增加數據的時候,同時更新緩存。
QBC(Query By Criteria) API提供了檢索對象的另一種方式,:
Hibernate取部分字段?
QBC是HQL更上層的封裝,會查詢所有字段。要想只使用部分字段,需要像寫SQL一樣寫HQL。
一種方案是:給實體類再加一個構造函數,構造函數只有必須的字段,這樣就不會全查( String hql=”select new Employee(e.id,e.name_cn) from Employee e”; )
另外一種是直接寫SQL,得到的東西再組裝成對象。Query query = getSession().createQuery(hql).setResultTransformer((Transformers.aliasToBean(clazz)));
DetachedCriteria的投影方式可以取得部分字段。
hibernate多表聯合查詢?
HQL:配置關系的話,可以不用join; 不配關系的話,HQL中寫join;
QBC的話,用createCriteria可以實現多表關聯。Criteria repA=cri.createCriteria("repAward", CriteriaSpecification.LEFT_JOIN);
Criteria works=cri.createCriteria("works", CriteriaSpecification.LEFT_JOIN);
HIbernate session 與 connection關系?
- session與connection,是多對一關系,每個session都有一個與之對應的connection,一個connection不同時刻可以供多個session使用。
- 多個session與一個connection綁定,底層操作數據庫的時會進行同步。
- 如果某個connection正在被某個session占用, open一個session,則創建一個新的connection與之對應。
- 有連接池的情況下,session關閉後,connection不一定關閉, 還可以查詢到應用占用的連接,若超過最大空閑時間,被連接池回收釋放。
- 有連接池的情況下,session使用完後不關閉,該connection被占用,若超過連接回收時間,也可被連接池回收釋放。
- 非連接池情況下,一個session占用一個connection,若不關閉,該connection無法釋放。
- 每個open的session都需要close。
連接池是多個端口嗎?
套接字是計算機網絡中應用層和傳輸層之間的接口。如果應用程序需要使用網絡功能,只需要調用套接字API即可。每個進程可以使用多個套接字,每個套接字都有一個標識符。對於TCP套接字,其標識符結構為:源IP,源端口,目的IP和目的端口。對於客戶服務器架構的網絡程序,服務器進程的端口是周知的,例如MySQL5543,而客戶進程端口是隨機分配的。也就是說,每個數據庫連接對象,和數據庫服務器通信都依賴於它自己的套接字,而這個套接字的端口號是各不相同的,盡管同屬於一個進程。
hibernate學習 六 Hibernate緩存