`
z75148885
  • 浏览: 191589 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate批量查询:Session.find/iterate

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

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

分享到:
评论

相关推荐

    hibernate批量删除.txt

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

    域模型的种状态与hibernate缓存PPT学习教案.pptx

    - `find()`或`iterate()`等查询操作时,确保返回最新数据。 - 显式调用`flush()`方法时。 【Hibernate的二级缓存】 除了Session的一级缓存,Hibernate还提供二级缓存,由SessionFactory管理,是跨Session的全局...

    ssh(structs,spring,hibernate)框架中的上传下载

     LobHandler必须注入到Hibernate会话工厂sessionFactory中,因为sessionFactory负责产生与数据库交互的Session。LobHandler的配置如代码 5所示:  代码 5 Lob字段的处理句柄配置 1. 2. … 3. 4. class="org....

    jdbc基础和参考

    1.hibernate提供的更面向对象的一种查询方式。 准备工作: 1.java中的POJO对象存在 2.数据库,表得存在 3.hibernate的配置文件(hibernate.cfg.xml)得存在 4.POJO.hbm.xml文件存在 5.hibernate的jar包以及数据库的...

    Hibernate方法总结

    不过,由于`iterate`会进行多次查询,所以对于频繁的写操作,应该使用`find`,以减少数据库交互次数,提高效率。 C. `save`、`update`、`saveOrUpdate` 和 `delete`: 1. `save`: 用于保存新对象到数据库,如果对象...

    J2EE Hibernate-5.ppt

    - **查询操作**:如find()或iterate(),若有对象属性变化,会先清理缓存确保查询结果准确。 - **显式flush()调用**:应用程序可以主动调用Session的flush()方法,强制清理缓存。 **3. Hibernate的二级缓存结构** ...

    getHibernateTemplate()有模糊查询和 分页

    `getHibernateTemplate().iterate(queryString).next()`这部分代码似乎是为了获取HQL查询("select count() from Info")的结果,即计算`Info`表中的记录总数。然而,这段代码可能不完整,因为它缺少关闭迭代器和...

    域对象在持久化层的状态

    2. **查询执行前**:当调用`Session.find()`或`Session.iterate()`方法时,如果缓存中存在对应的持久化对象,Session会首先尝试从缓存中获取,而不是直接访问数据库。若缓存中无数据,才会发起数据库查询。 #### 四...

    Hibernate中的实体状态及转换

    **临时状态(Transient) -> 持久化状态(Persistent)**:通过调用Session的`get()`, `load()`, `find()`, `iterate()`等方法,可以直接将新创建的对象绑定到数据库中的记录,从而使其进入持久化状态。 **游离状态...

    快速了解Hibernate中的Session

    - 查询操作:`find()`或`iterate()`时,如果对象属性有变动,会先清理缓存以更新查询结果。 - 显式调用`flush()`:手动触发缓存清理,执行计划的SQL语句。 5. **Session接口的方法**: - `save()`: 将临时对象...

    Hibernate对象持久化状态

    - **query**:通过 `find()`、`iterate()` 等方法进行数据库查询,会检查缓存,若有匹配对象则直接返回。 理解 Hibernate 中对象的状态和 Session 缓存的工作机制,对于优化应用程序性能和正确处理数据变更至关重要...

    hibernateTemplate的常用方法

    2. **deleteAll(Collection entities)**:批量删除实体集合中的所有实体。 - **示例**: ```java List<Teacher> teachers = new ArrayList(); // 添加teacher对象 hibernateTemplate.deleteAll(teachers); ```...

    Hibernate缓存机制

    - `find`方法用于执行远端查询,即直接从数据库中获取数据。 - **1.2.2. N+1查询问题** - 当使用`iterate`遍历查询结果时,可能会引发N+1次查询的问题。 - “N+1”中的“1”是指第一次查询,而“N”则是指后续...

Global site tag (gtag.js) - Google Analytics