2011-05-11 187 views
1

這裏是場景:關於休眠緩存

我會從我的數據庫中選擇一些記錄,比如1000條記錄。然後,我將對該結果集執行一些操作,例如在其中插入一條記錄或更新現有記錄。

整個上述過程將重複多次,比如說2000次。 (即我將再次選擇一些記錄,但它們不需要每次都完全相同的記錄)

我確信我可以使用某種緩存來獲得更好的性能。但我不知道如何。有人可以指導我嗎?

+0

你可以介紹一下你當前的Hibernate配置嗎? – abalogh 2011-05-11 15:53:06

+0

@abalogh:你究竟需要知道什麼?對不起,我對休眠很陌生 – Bhushan 2011-05-11 15:55:18

+0

請發佈hibernate.cfg.xml – 2011-05-11 16:03:17

回答

4

當你使用Hibernate,你實際上是使用兩個高速緩存。第一個是會話緩存。假設您查詢2000條記錄,更新並保存更改爲5,然後再次運行相同的查詢(全部在單個會話的範圍內)。 Hibernate實際上不會再次運行查詢 - 它知道你已經將2000條記錄(和5條編輯)加載到內存中。這個緩存會自動打開 - 您無法關閉它,因爲它是Hibernate核心功能的一部分。您確實需要關閉(或至少刷新)會話以確保應用更改 - 您不僅希望打開一個巨大的會話並不斷改變內容或最終會耗盡內存。

第二級緩存基本上在您的應用程序和數據庫之間放置了一個鍵值存儲。這個緩存通常是較長壽命的,多個會話可以使用它,但它也更復雜(例如需要正確處理線程,失效等)。最大的問題是如果你的數據變化很大,你實際上必須在二級緩存和數據庫中進行更改,這比直接進行更改要慢。但是,第二級緩存對於只讀數據來說太棒了。

調整Hibernate和緩存可能相當具有挑戰性和複雜性。我強烈建議使用諸如p6spy之類的工具來查看應用程序和數據庫之間的數據庫流量。

+0

非常感謝您的澄清。我以前問過一個問題http://stackoverflow.com/questions/5952074/how-to-use-hibernate-sessions,所以你的回答是由jeremy給出的答案是不正確的? – Bhushan 2011-05-11 17:16:48

+0

您可以打開一個會話並讓該會話處理多個事務。如果您查看http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html上的示例,您將看到會話可以具有beginTransaction()和commit()。所以,如果你願意的話,你可以重用Session對象,但Session緩存會被有效地抹去。如果一個Session = 1事務,那麼Session知道兩者之間的狀態匹配。如果一個會話= 2個事務,那麼數據庫的狀態可能會在這兩個事務之間改變。 – 2011-05-11 23:48:16

0
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/empi</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">admin</property> 
<!--   <property name="show_sql">true</property> --> 
    <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 
     <mapping resource="com/mycomp/myproj/pkg/Patient.hbm.xml"/> 
     <mapping resource="com/mycomp/myproj/pkg/Xref.hbm.xml"/> 
     <mapping resource="com/mycomp/myproj/myprojHibernateConfig/myprojPatient.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration>