`

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());

分享到:
评论

相关推荐

    HibernateDao.java

    - **CRUD操作**:包括保存(Save)、更新(Update)、删除(Delete)和查询(Find)等基本数据库操作,这些操作通常通过Session的方法实现。 - **HQL/SQL查询**:Hibernate支持HQL(Hibernate Query Language)和...

    Hibernate持久层方法汇总

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

    hibernate5.2.10.Final.rar

    Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),有效提高了数据访问速度。 7. **HQL(Hibernate Query Language)** 类似于SQL的查询语言,专门针对对象进行查询,更加面向...

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

    - 使用find()或get()方法获取对象,或使用createQuery()或createSQLQuery()构建查询语句。 - 在事务中执行批量操作,确保数据的原子性和一致性。 - 利用缓存机制提高数据访问速度,如一级缓存(Session级)和二级...

    hibernate基础.doc

    Session提供了诸如save、find、flush等方法,用于CRUD操作。例如,保存对象: ```java TUser user = new TUser(); user.setName("Emma"); session.save(user); ``` 查询数据: ```java String hql = "from TUser ...

    hibernate 执行原生sql的几种方式

    Hibernate的`Session`接口提供了`createSQLQuery()`方法,允许我们直接编写SQL语句。例如: ```java Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery("SELECT * FROM...

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

    本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session方法的实现,这对于理解ORM的工作原理及优化数据库访问逻辑具有重要意义。 首先,我们需要了解Hibernate的核心概念——Session。在Hibernate中,...

    hibernate学习.doc

    总的来说,本教程为初学者提供了一条在Tomcat中设置和使用Hibernate的基础路径,涵盖了必要的库、配置和操作步骤,是理解Hibernate工作原理和使用方法的良好起点。通过实践这些步骤,读者可以更好地掌握ORM技术,...

    妙解HIBERNATE 3.X:叩响面向对象思想之门

    通过Session的save()、update()方法可以保存或更新对象,而delete()方法用于删除对象,find()和load()等方法用于查询对象。 4. Criteria查询与HQL:除了传统的SQL查询,Hibernate提供了Criteria API和HQL...

    hibernate3.5.6.zip

    Session接口提供了find()、get()等方法来查询数据。 4. Querying:Hibernate提供HQL(Hibernate Query Language)和Criteria API进行数据查询,支持复杂的查询表达式,可以更直观地操作对象而非SQL语句。 二、...

    hibernate批量删除.txt

    - **查询数据**:使用`session.createQuery()`或者`session.find()`方法查询出需要删除的数据。 - **执行删除操作**:对查询结果进行遍历,并执行删除操作。 - **提交事务**:使用`transaction.commit()`提交事务...

    hibernate3.3.zip

    Hibernate允许使用Native SQL执行数据库特定的SQL语句,甚至可以通过Session的createCallableStatement()方法执行存储过程。 10. 第二级缓存与查询缓存: Hibernate的二级缓存通过CacheProvider实现,如Ehcache,...

    hibernate更新操作

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

    hibernate常见问题及处理.doc

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

    Hibernate查询解决方案

    本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...

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

    通常,一级缓存由Hibernate Session管理,而二级缓存则可以跨越多个Session进行共享。 在Spring Boot项目中配置Redis作为Hibernate的二级缓存,我们需要以下步骤: 1. **添加依赖**: 首先,在`pom.xml`文件中...

    hibernate-3.3.2.GA.zip

    Hibernate是一个开源的Java库,它提供了一种映射关系型数据库与Java对象的方法,从而实现了对象持久化。在Hibernate 3.3.2.GA版本中,它进一步完善了对JPA(Java Persistence API)的支持,提升了性能,并增强了对...

    hibernate入门 数据查询.doc

    `Session`对象是与数据库交互的主要接口,提供了多种查询方法,如`find()`、`load()`、`query()`等。在这个例子中,我们使用`find()`方法执行HQL查询。 **2. Hibernate Query Language (HQL)** HQL是一种面向对象...

    Spring整合Hibernate.jar

    SessionFactory是Hibernate的核心接口,用于创建Session对象,它是与数据库交互的入口点。 ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ...

    hibernate-release-4.3.1.Final.rar

    - CRUD操作:Hibernate提供了save(), saveOrUpdate(), update(), merge()等方法进行增删改操作;而find(), get()等用于查询。 - HQL与 Criteria API:Hibernate查询语言(HQL)允许使用面向对象的方式写查询,...

Global site tag (gtag.js) - Google Analytics