`

hibernate 2 中session.find()在hibernate 3中的代替

阅读更多
Session.find()方法
我被Session.find()的方法困扰了好几天,今天才看到新的Hibernate里没有了Session.find()方法。
现在转载在此,方便你我。

查询性能往往是系统性能表现的一个重要方面,查询机制的优劣很大程度上决定了系统的整体性能。这个领域往往也存在最大的性能调整空间。

hibernate2中Session.find()对应于3中的session.createQuery().list();
hibernate2中Session.iterate()对应于3中的session.createQuery().iterate();
find和iterate区别:
find方法通过一条Select SQL实现了查询操作,而iterate方法要执行多条Select SQL.
iterate第一次查询获取所有符合条件的记录的id,然后再根据各个id从库表中读取对应的记录,这是一个典型的N+1次的查询问题,如果符合条件记录有10000条,就需要执行10001条Select SQL,可想性能会如何的差。

那为什么要提供iterator方法,而不只是提供高效率的find方法?

原因1.与hibernate缓存机制密切相关
find方法实际上是无法利用缓存的,它对缓存只写不读。
find方法只执行一次SQL查询,它无法判断缓存中什么样的数据是符合条件的,也无法保证查询结果的完整性。而iterate方法,会首先查询所有符合条件记录的id,然后根据id去缓存中找,如果缓存中有该id,就返回,没有可以根据id再去数据库查询。
String hql = "from TUser where age > ?";
List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
顺序执行,iterate方法只会执行一次SQL查询,就是查找id,然后根据id就可以从缓存中获得数据。

String hql = "from TUser where age > ?";
List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
缓存是不起作用的。
如果目标数据读取相对较为频繁,通过iterate这种机制,会减少性能损耗。

原因2.内存使用上的考虑
find方法将一次获得的所有记录并将其读入内存。如果数据量太大,可能会触发OutOfMemoryError,从而导致系统异常。解决方案之一就是结合iterate方法和evict方法逐条对记录进行处理,将内存消化保持在一个可以接受的范围之内。如:
String hql = "from TUser where age > ?";
Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
while(it.hasNext()) {
    TUser user = (TUser)it.next();
   
    //将对象从一级缓存中删除
    session.evict(user);

    //二级缓存可以设定最大缓存量,达到后自动对较老数据进行废除,但也可以通过编
    //码移除,这样有助于保持数据有效性。
    sessionFactory.evict(TUser.class, user.getID());
}

0
1
分享到:
评论

相关推荐

    hibernate 执行原生sql的几种方式

    在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库特性或者优化性能时。本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1....

    hibernate入门 数据查询.doc

    - 配置文件`hibernate.cfg.xml`用于设置数据库连接和其他配置,需确保正确配置。 - `SessionFactory`是线程不安全的,通常在应用启动时创建一次,然后在整个应用生命周期中复用。 - 记得在完成数据库操作后关闭`...

    hibernate5.2.10.Final.rar

    - **Configuration**:配置对象,负责读取hibernate.cfg.xml配置文件,初始化SessionFactory。 - **SessionFactory**:会话工厂,是线程安全的,用于创建Session对象。 - **Session**:工作单元,它是数据库会话...

    实现自己的Hibernate框架之Session 方法实现

    2. **事务处理**:在Session方法中通常会包裹在一个事务中,以确保数据操作的一致性和完整性。 3. **对象状态管理**:Hibernate需要跟踪对象的状态,如临时态、持久态、游离态,以便决定何时进行保存、更新或删除...

    hibernate-release-5.0.0.Final(1).zip

    本次我们将深入探讨的版本是`hibernate-release-5.0.0.Final(1)`,这个版本在Hibernate的生命周期中具有重要的地位,它引入了多项新特性和改进,旨在提升开发效率和性能。 一、Hibernate概述 Hibernate是Java领域中...

    Hibernate持久层方法汇总

    本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...

    hibernate basedao(泛型版本)

    在Java的持久层框架Hibernate中,BaseDAO(基础数据访问对象)是常用的设计模式,用于封装对数据库的基本操作。在给定的“hibernate basedao(泛型版本)”中,开发人员通过引入泛型进一步提高了代码的复用性和灵活...

    Hibernate's JPA.rar

    3. **hibernate.cfg.xml**:Hibernate的配置文件,可能包含数据库连接、缓存设置等。 4. **测试类**:展示如何使用EntityManager进行CRUD操作。 5. **依赖库**:包含`hibernate-entitymanager.jar`和其他可能需要的...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    在本文中,我们将深入探讨如何在Spring Boot 2.1.4.RELEASE项目中结合JPA(Java Persistence API)和Hibernate实现Redis作为二级缓存。首先,我们需要理解这些技术的基本概念。 Spring Boot 是一个用于简化Spring...

    hibernate更新操作

    3. **数据查询与更新**:在同一个Session中,我们可以通过Session的`find()`方法查询数据。在示例中,`session.find("from User")`执行了一个HQL(Hibernate Query Language)查询,返回了User表的所有记录。然后,...

    hibernate批量删除.txt

    2. **减少SQL执行次数**:在上述示例中,每次删除操作都会生成一条SQL语句,这会增加数据库的压力。可以考虑使用HQL或原生SQL批量执行删除操作,以减少SQL执行次数。 ```java Transaction tx = session.begin...

    hibernate常见问题及处理.doc

    3. `net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class …` 这个异常表示Hibernate无法找到Java类中与XML映射文件中指定的属性相对应的getter或setter方法。确保...

    hibernate-annotations3.4.0.GA.zip

    在项目中,你需要正确配置这个文件,以使Hibernate能够找到并使用你的实体类。 5. **操作实体** - `EntityManager`:负责管理实体的生命周期,如创建、查找、更新和删除。 - `Transaction`:处理事务,确保数据的...

    hibernate_ jpa.jar

    1. **实体(Entity)**:在Hibernate JPA中,实体是数据库表的映射,通过@Entity注解标识,每个实体类对应数据库中的一个表。 2. **实体关系(Entity Relationships)**:实体之间可以通过一对多、多对一、一对一、...

    hibernate-3.2.1.jar.zip

    在这个专题中,我们将聚焦于Hibernate 3.2.1版本,探讨其在项目框架中的集成及其核心功能。 首先,`hibernate-3.2.1.jar`是Hibernate 3.2.1的核心库文件,包含了Hibernate框架的主要类和接口,使得开发人员能够通过...

    hibernate-3.3.2.GA.zip

    2. SessionFactory:工厂类,用于创建Session对象,是线程安全的,通常在整个应用程序中只创建一个。 3. Session:持久化操作的主要接口,代表一次数据库会话,提供了数据持久化和查询的功能。 4. Transaction:事务...

    jsp Hibernate入门教程第1 3页.docx

    其中,`new Configuration().configure()` 会加载默认的配置文件 (`hibernate.cfg.xml`),然后调用 `buildSessionFactory()` 方法创建 `SessionFactory`。 ```java List users = session.find("from User"); User ...

    hibernate-release-4.3.4.Final

    3. EntityManager和EntityTransaction:在JPA(Java Persistence API)规范中引入,Hibernate也支持。EntityManager处理实体的生命周期,而EntityTransaction则负责事务管理。 4. Criteria API:提供了一种更加面向...

    spring3 + hibernate3 实现用户的增删改查

    同时,也需要创建Hibernate的配置文件(`hibernate.cfg.xml`),指定数据库连接信息和实体类的映射文件。 接下来,你需要定义用户实体类(如`User.java`),该类应包含用户的基本属性(如用户名、密码、邮箱等),...

Global site tag (gtag.js) - Google Analytics