Java 关于hibernate缓存

Java 关于hibernate缓存,java,hibernate,nhibernate,Java,Hibernate,Nhibernate,以下是场景: 我将从数据库中选择一些记录,比如1000条记录。然后,我将对该结果集执行一些操作,比如在其中插入一条记录或更新现有记录 上述整个过程将重复多次,比如说2000次。(即,我将再次选择一些记录,但它们不必每次都完全相同) 我确信我可以使用某种缓存来获得更好的性能。但我不知道怎么做。有人可以指导我吗?您可以使用Hibernate二级缓存。这是一个很好的教程 您可以使用Hibernate二级缓存。这是一个很好的教程 org.hibernate.dialogue.mysqldialogue

以下是场景:

我将从数据库中选择一些记录,比如1000条记录。然后,我将对该结果集执行一些操作,比如在其中插入一条记录或更新现有记录

上述整个过程将重复多次,比如说2000次。(即,我将再次选择一些记录,但它们不必每次都完全相同)


我确信我可以使用某种缓存来获得更好的性能。但我不知道怎么做。有人可以指导我吗?

您可以使用Hibernate二级缓存。这是一个很好的教程


您可以使用Hibernate二级缓存。这是一个很好的教程


org.hibernate.dialogue.mysqldialogue
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/empi
根
管理
线

org.hibernate.dialogue.mysqldialogue
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/empi
根
管理
线

使用Hibernate时,实际上使用了两个缓存。第一个是会话缓存。假设您查询了2000条记录,更新并将更改保存到5,然后再次运行相同的查询(都在单个会话的范围内)。Hibernate实际上不会再次运行查询—它知道您已经将2000条记录(以及5次编辑)加载到内存中。这个缓存是自动打开的-你不能关闭它,因为它是Hibernate核心功能的一部分。您确实需要关闭(或至少刷新)您的会话,以实际确保应用更改-您不希望只打开一个巨大的会话并不断更改内容,否则最终会耗尽内存

第二级缓存基本上在应用程序和数据库之间放置一个键值存储。此缓存通常寿命较长,多个会话可以使用它,但它也更复杂(例如,需要正确处理线程、失效等)。最大的问题是,如果您的数据变化很大,实际上您必须在二级缓存和数据库中进行更改,这可能比直接进行更改要慢。然而,对于只读数据来说,二级缓存非常棒


调整Hibernate和缓存可能非常具有挑战性和复杂。我强烈建议使用p6spy之类的工具来查看应用程序和数据库之间的数据库通信量

使用Hibernate时,实际上使用的是两个缓存。第一个是会话缓存。假设您查询了2000条记录,更新并将更改保存到5,然后再次运行相同的查询(都在单个会话的范围内)。Hibernate实际上不会再次运行查询—它知道您已经将2000条记录(以及5次编辑)加载到内存中。这个缓存是自动打开的-你不能关闭它,因为它是Hibernate核心功能的一部分。您确实需要关闭(或至少刷新)您的会话,以实际确保应用更改-您不希望只打开一个巨大的会话并不断更改内容,否则最终会耗尽内存

第二级缓存基本上在应用程序和数据库之间放置一个键值存储。此缓存通常寿命较长,多个会话可以使用它,但它也更复杂(例如,需要正确处理线程、失效等)。最大的问题是,如果您的数据变化很大,实际上您必须在二级缓存和数据库中进行更改,这可能比直接进行更改要慢。然而,对于只读数据来说,二级缓存非常棒


调整Hibernate和缓存可能非常具有挑战性和复杂。我强烈建议使用p6spy之类的工具来查看应用程序和数据库之间的数据库通信量

你能介绍一下你目前的Hibernate配置吗?@abalogh:你到底需要知道什么?抱歉,我对hibernate非常陌生请发布hibernate.cfg.xmlpost任何名称中包含“hibernate”或“persistence”的配置文件。请查看hibernate.cfg.xml文件内容您可以告诉我一些关于当前hibernate配置的信息吗?@abalogh:您到底需要知道什么?很抱歉,我对hibernate很陌生。请发布hibernate.cfg.xmlpost任何名称中包含“hibernate”或“persistence”的配置文件。请查看hibernate.cfg.xml文件内容,以了解详细信息。我以前问过一个问题,所以根据你的回答,jeremy给出的答案是否不正确?你可以打开一个会话,让该会话处理多个事务。如果您查看下面的示例,您将看到会话可以有beginTransaction()和commit()。因此,如果需要,您可以重用会话对象,但无论如何,会话缓存将在该事务之外被有效地擦除。如果会话=1个事务,则会话知道两个事务之间的状态匹配。如果会话=2+个事务,数据库的状态可能会在这两个事务之间发生变化。非常感谢您的澄清。我以前问过一个问题,所以根据你的回答,jeremy给出的答案是否不正确?你可以打开一个会话,让该会话处理多个事务。如果您查看下面的示例,您将看到会话可以有beginTransaction()和commit()。因此,如果需要,您可以重用会话对象,但无论如何,会话缓存将在该事务之外被有效地擦除。如果会话=1个事务,则会话知道两个事务之间的状态匹配。如果会话=2+个事务,则数据库的状态可能会在这两个事务之间发生变化。
<?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>