2011-05-11 135 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>