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会自动flushsessionA对象的缓存,然后提交事务,关闭session随心。当threadA撤销sessionA对象关联的事务时,也会自动关闭sessionA对象
若threadA再次调用SessionFactory对象的getCurrentSession()方法时,该方法会又创建一个新的Session(sessionB)对象,把该对象与threadA绑定,并将sessionB返回
批量处理数据
批量处理数据是指在一个事务中处理大量数据
在应用层进程批量操作,主要有以下方式:
①通过Session
②通过HQL
③通过StatelessSession
④通过JDBCAPI----推荐此种,因为速度最快
Session进行批量操作:
Session的save()及update()方法都会把处理的对象存放在自己的缓存中。如果通过一个Session对象来处理大量持久化对象,应该及时从缓存中清空已经处理完毕并且不会再访问的对象。具体的做法是在处理完一个对象或小批量对象后,立即调用flush()方法刷新缓存,然后再调用clear()方法情况缓存
通过Session来进行处理操作会受到以下约束:
需要在Hibernate配置文件中设置JDBC单次批量处理的数目,应保证每次向数据库发送的批量的SQL语句数目与batchsize属性一致
若对象采用"identity"标识生成器,则Hibernate无法在JDBC曾进行批量插入操作
进行批量操作时,建议关闭Hibernate的二级缓存
批量插入数据代码演示:
Newsnews=null; for(inti=0;i<10000;i++){ news=newNews(); news.setTitle("--"+i);
session.save(news); if((i+1)%20==0){ session.flush(); session.clear(); } }