gpt4 book ai didi

Hibernate管理Session和批量操作分析

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Hibernate管理Session和批量操作分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文详细分析了Hibernate管理Session和批量操作的用法。分享给大家供大家参考。具体分析如下:

Hibernate管理Session 。

Hibernate自身提供了三种管理Session对象的方法 ① Session对象的生命周期与本地线程绑定 ② Session对象的生命周期与JTA事务绑定 ③ Hibernate委托程序管理Session对象的生命周期 。

在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括: ① thread:Session对象的生命周期与本地线程绑定 ② jta*:Session对象的生命周期与JTA事务绑定 ③ managed:Hibernate委托程序来管理Session对象的生命周期 。

Session对象的生命周期与本地线程绑定: 如果把Hibernate配置文件的hibernate.current_session_context_class属性值设置为thread,Hibernate就会按照与本地线程绑定的方式来管理Session 。

Hibernate按以下规则把Session与本地线程绑定: 当一个线程(thread)第一次调用SessionFactory对象的getCurrentSession()方法时,该方法会创建一个新的Session(sessionA)对象,把该对象与threadA绑定,并将session返回 当threadA再次调用SessionFactory对象的getCurrentSession()方法时,该方法将返回sessionA对象 当threadA提交sessionA对象关联的事务时,Hibernate会自动flush sessionA对象的缓存,然后提交事务,关闭session随心。当threadA撤销sessionA对象关联的事务时,也会自动关闭sessionA对象 若threadA再次调用SessionFactory对象的getCurrentSession()方法时,该方法会又创建一个新的Session(sessionB)对象,把该对象与threadA绑定,并将sessionB返回 。

批量处理数据 。

批量处理数据是指在一个事务中处理大量数据 在应用层进程批量操作,主要有以下方式: ① 通过Session ② 通过HQL ③ 通过StatelessSession ④ 通过JDBC API----推荐此种,因为速度最快 。

Session进行批量操作:

Session的save()及update()方法都会把处理的对象存放在自己的缓存中。如果通过一个Session对象来处理大量持久化对象,应该及时从缓存中清空已经处理完毕并且不会再访问的对象。具体的做法是在处理完一个对象或小批量对象后,立即调用flush()方法刷新缓存,然后再调用clear()方法情况缓存 。

通过Session来进行处理操作会受到以下约束:

需要在Hibernate配置文件中设置JDBC单次批量处理的数目,应保证每次向数据库发送的批量的SQL语句数目与batch size属性一致 。

若对象采用"identity"标识生成器,则Hibernate无法在JDBC曾进行批量插入操作 。

进行批量操作时,建议关闭Hibernate的二级缓存 。

批量插入数据代码演示:

复制代码代码如下:

News news = null; for(int i = 0; i < 10000; i++) {     news = new News();     news.setTitle("--" + i),

  。

    session.save(news);     if((i + 1) % 20 == 0) {         session.flush();         session.clear();     } } 。

  。

批量更新:在进行批量更新时,如果一下子把所有对象都加载到Session缓存,然后再缓存中一一更新,显然是不可取的 。

使用可滚动的结果集org.hibernate.ScrollableResults,该对象中实际上并不包含任何对象,只包含用于在线定位记录的游标。只有当程序遍历访问ScrollableResults对象的特定元素时,它才会到数据库中加载相应的对象 org.hibernate.ScrollableResults对象由Query的scroll方法返回 。

通过HQL进行批量操作:

注意:HQL只支持INSERT INTO ... SELECT形式的插入语句,但不支持INSERT INTO ... VALUES形式的插入语句。所以使用HQL不能进行批量插入操作 。

通过StatelessSession进行批量操作:

从形式上看,StatelessSession与Session的用法类似。StatelessSession与Session相比,有以下区别:

StatelessSession没有缓存,通过StatelessSession来加载、保存或更新后的对象处于游离状态 StatelessSession不会与Hibernate的二级缓存交互 当调用StatelessSession的save()、update()或delete()方法时,这些方法会立即执行相应的SQL语句,而不会仅计划执行一条SQL语句 StatelessSession不会进行脏检查,因此修改了Customer对象属性后,还需要调用StatelessSession的update()方法来更新数据库中数据 StatelessSession不会对关联的对象进行任何的级联操作 通过同一个StatelessSession对象两次加载的OID为1的Customer对象,得到的两个对象内存地址不同 StatelessSession所做的操作可以被Interceptor拦截器捕获到,但是会被Hibernate的事件处理系统忽略掉 。

希望本文所述对大家的Java程序设计有所帮助.

最后此篇关于Hibernate管理Session和批量操作分析的文章就讲到这里了,如果你想了解更多关于Hibernate管理Session和批量操作分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com