Hibernate之管理session与批处理
1. Hibernate 自身提供了三种管理Session对象的方法
–Session对象的生命周期与本地线程绑定–Session 对象的生命周期与JTA事务绑定–Hibernate 委托程序管理Session对象的生命周期
2.Hibernate中Session管理方式的配置
在 Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括
–thread:Session
对象的生命周期与本地线程绑定–jta*:Session
对象的生命周期与 JTA 事务绑定–managed: Hibernate 委托程序来管理Session对象的生命周期
3. Session 对象的生命周期与本地线程绑定
C、Session对象的生命周期与本地线程绑定测试:
首先,在hibernate配置文件中加入如下配置,用来生命session的管理方式:
<!-- 配置管理session的方式 -->
<property name="current_session_context_class">thread</property>
再写一个HibernateUtil类来统一的获取session对象:
public class HibernateUtil {
private SessionFactory sessionFactory;
private static HibernateUtil instance=new HibernateUtil();
private HibernateUtil(){};
public static HibernateUtil getInstance(){
return instance;
}
public SessionFactory getSessionFactory() {
if(this.sessionFactory==null){
Configuration cfg=new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
this.sessionFactory=cfg.buildSessionFactory(serviceRegistry);
}
return sessionFactory;
}
public Session getSession(){
return getSessionFactory().getCurrentSession();
}
}
提供一个DepartmentDao类用来操作Department数据:
public class DepartmentDao {
public void save(Department dept){
Session session=HibernateUtil.getInstance().getSession();
System.out.println(session.hashCode());
//session.save(dept);
}
}
测试类:
@Test
public void testManagerSession(){ Session session=HibernateUtil.getInstance().getSession();
Transaction transaction=session.beginTransaction();
Department dept=new Department();
dept.setName("abc");
DepartmentDao deptDao=new DepartmentDao();
deptDao.save(dept);
deptDao.save(dept);
deptDao.save(dept);
transaction.commit(); //使用thread的方式管理session,则在提交和回滚事物时,关闭session
System.out.println(session.isOpen());
}
测试结果:
999807287
999807287
999807287
false
由此可见:在当前线程中,若没有执行提交事物或者回滚事物操作,通过getCurrentSession()方法获取到的都是同一个session对象,并且执行事物commit()之后,session关闭!
4. 批处理数据
主要有以下方式:
1. 通过session批处理数据:
•Session 的 save()及update()方法都会把处理的对象存放在自己的缓存中.如果通过一个Session对象来处理大量持久化对象,应该及时从缓存中清空已经处理完毕并且不会再访问的对象.具体的做法是在处理完一个对象或小批量对象后,立即调用flush()
方法刷新缓存, 然后在调用clear()方法清空缓存
•通过 Session来进行处理操作会受到以下约束
–需要在 Hibernate
配置文件中设置JDBC单次批量处理的数目,应保证每次向数据库发送的批量的SQL语句数目与batch_size属性一致
–若对象采用 “identity”标识符生成器,则Hibernate无法在JDBC层进行批量插入操作
–进行批量操作时, 建议关闭Hibernate的二级缓存
2. 通过HQL批处理:
但不支持INSERTINTO … VALUES形式的插入语句.
所以使用HQL不能进行批量插入操作.
3. 通过 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的事件处理系统忽略掉。
4. 通过JDBC API(推荐)
使用方式:
public void testBatch(){
session.doWork(new Work() {
@Override
public void execute(Connection con) throws SQLException {
//通过JDBC原生的API操作,效率最高,速度最快
}
});
}
Hibernate之管理session与批处理的更多相关文章
- :Hibernate逍遥游记-第16管理session和实现对话
1. package mypack; public class Monkey{ private Long id; private String name; private int count; pri ...
- Hibernate管理Session和批量操作
Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hiber ...
- hibernate 管理 Session(单独使用session,不spring)
Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session
知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...
- hibernate 管理 Session(单独使用session,非spring)
Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- Hibernate管理Session
Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hibernate委托程序管理Session对象 ...
- 【Hibernate】Hibernate系列8之管理session
管理session 更简单的,注入对象:
- Hibernate 系列 05 - Session 类
引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...
- org.hibernate.HibernateException: No Session found for current thread
spring.springmvc和hibernate整合 在sessionFactory.getCurrentSession()时,出现以下异常 No Session found for curren ...
随机推荐
- hadoop2 环境的搭建(手动HA)
1.手工切换ha的环境的搭建(比hadoop1多出来journalnode的配置) namenode:hadoop110和hadoop111 datanode:hadoop112.hadoop113. ...
- bzoj2324营救皮卡丘
费用流. 建图比较重要. 1.S->id[0][0] flow=k. 表示k条路径. 2.S->id[i][0] flow=1, 每次消耗1流量就补充1流量. 3.id[i][1]-> ...
- jquery 字符串转json
这里考虑的都是服务器返回JSON形式的字符串的形式 代码如下: var data=" { root: [ {name:'1',value:'0'}, {name:'6101',value:' ...
- [转] jQuery Infinite Ajax Scroll(ias) 分页插件介绍
原文链接:http://justflyhigh.com/index.php/articlec/index/index.php?s=content&m=aticle&id=91 Infi ...
- DrawDib函数组的使用
Microsoft的针对与设备无关位图(DIB位图),在其WIN32 SDK的Multimedia中提供了一组绘制DIB位图的高性能函数组──DrawDib函数组.DrawDib函数组是一组不依赖于图 ...
- JQuery实现——黑客帝国代码雨效果
效果如你所见就是本页面上方那样的效果 实现方法来自一个印度小伙纸,学习完我也没总结一下,今儿个补上 如何实现,大家右键查看源码复制即可,不过学习的过程还是要总结总结. 下面通过另外两个小例子,一步一步 ...
- .NET/ASP.NET Routing路由(深入解析路由系统架构原理)http://wangqingpei557.blog.51cto.com/1009349/1312422
阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...
- Delphi EVariantTypeCastError错误的解决方法
在执行程序的时候总是提示: ---------------------------Debugger Exception Notification---------------------------P ...
- delphi 编译的时候 把Warning去除的方法
delphi 编译的时候 把Warning去除的方法 在 添加 {$WARNINGS OFF}
- ubuntu鼠标突然不能使用的解决方法
今天发现鼠标(usb即插即用)不能用了,最后发现需要接通充电才可以!!!用电池的时候居然不可以用鼠标?