在hibernate當(dāng)中重點(diǎn)比較了find及iterate的使用,主要是他們在查詢數(shù)據(jù)時的優(yōu)劣勢的比較,而由session.find()方法也引申出了query cache這個概念及對find在查詢時的劣勢的解悶方案。雖然query cache在使用上還是有很多的局限,但是它對提高find的性能起到了很大的作用。
在Hibernate2.0當(dāng)中使用:session.find(),session.iterate(),而hibernate3.0當(dāng)中使用的是query.find(),query.iterate()來代替。
下面我們著重分析一下這兩個方法的使用:
? 1. 如果我們在使用find,iterate進(jìn)行查詢時分別構(gòu)建他們的HQL,那么我們在控制臺輸出當(dāng)中看到iterate()方法所使用的SQL語句的次數(shù)要遠(yuǎn)遠(yuǎn)超過Find()。
? 但是,為什么iterate()還存在呢?
? 2. 當(dāng)我們在使用find構(gòu)建HQL后,而同樣的查詢也讓iterate()來執(zhí)行一次的話(前提是必須使用find()構(gòu)建的HQL),那么iterate()的執(zhí)行并不再像前面介紹的那樣會比find()方法多執(zhí)行SQL,而是根本再執(zhí)行一條SQL。這就是iterate()方法的使用。它使用了Hibernate緩存機(jī)制.Find()方法在查詢出結(jié)果后把查詢結(jié)果集置入緩存,而iterate()執(zhí)行的時候先執(zhí)行一條Select SQL,查詢所有符合條件的結(jié)果集,接下來iterate()根據(jù)查詢的id在本地緩存中查找符合條件的結(jié)果集,如果有完全符合條件的結(jié)果集,則直接以此作為返回結(jié)果。如果沒有找到再執(zhí)行相應(yīng)的SQL,并且把結(jié)果納入緩存當(dāng)中。以備使用
3.緩存機(jī)制并不對find()方法起使用。如果你兩次執(zhí)行相同條件的或相近條件的HQL,第二個方法的SQL并不減少。還會照常執(zhí)行。這就是說緩存機(jī)制并不對find()方法起作用。find()對緩存只寫不讀,而iterate()方法就可以充分利用緩存的優(yōu)勢。
4.內(nèi)存方面的考慮,除了緩存的優(yōu)勢之外,我們還可以利用iterate()與evict()方法來提升查詢性能上的優(yōu)勢。
???? 這個問題主要是大數(shù)據(jù)量所帶來的考慮。因?yàn)閒ind()方法可以對大數(shù)據(jù)量的結(jié)果集進(jìn)行緩存,但是如果數(shù)據(jù)量超大的話,也會帶來內(nèi)存溢出方面的問題。利用iterate(),evict()可以對記錄進(jìn)行逐條處理,將內(nèi)存消耗保持在可接受的范圍之內(nèi)。
? 它包括從session中消除對對象,及從sessionFactory當(dāng)中消除對象。
5.?對于find()方法在讀取緩存問題方面的解決。Query Cache是一個解決方案,不過目前的使用受限比較大。
??? 使用Query Cache的條件是:
????? A。數(shù)據(jù)庫表結(jié)構(gòu)不變。即未發(fā)生過update,insert,delete等操作
????? B。相同的HSQL的重復(fù)執(zhí)行操作。
由于以上兩個原因,query Cache的使用上受到了很大 的限制。
如果想使用query cache我們需要配置 hibernate.cfg.xml文件:
<class ......>
?? <property nam="hibernate,cache.use_query_cache">True</property>
</class>
在編碼當(dāng)中使用:Query.setQueryCache(true);即可。
posted on 2006-07-25 16:03
水煮三國 閱讀(3598)
評論(0) 編輯 收藏 所屬分類:
Hibernate