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 对象的生命周期与本地线程绑定

A、如果把 Hibernate配置文件的hibernate.current_session_context_class属性值设为thread,Hibernate 就会按照与本地线程绑定的方式来管理 Session
B、Hibernate 按以下规则把Session与本地线程绑定
      –当一个线程(threadA)第一次调用SessionFactory对象的getCurrentSession()方法时,该方法会创建一个新的Session(sessionA)对象,把该对象与threadA绑定,并将sessionA返回
     –当 threadA再次调用SessionFactory对象的getCurrentSession()方法时,该方法将返回sessionA对象
     –当 threadA提交sessionA对象关联的事务时,Hibernate 会自动flushsessionA对象的缓存,然后提交事务,关闭sessionA对象.当threadA撤销sessionA对象关联的事务时,也会自动关闭sessionA对象
     –若 threadA再次调用SessionFactory对象的getCurrentSession()方法时,该方法会又创建一个新的Session(sessionB)对象,把该对象与threadA绑定,并将sessionB返回

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. 批处理数据

A、批量处理数据是指在一个事务中处理大量数据.
B、在应用层进行批量操作,
主要有以下方式:
      –通过 Session
      –通过 HQL
      –通过 StatelessSession
      –通过 JDBC API

1. 通过session批处理数据:

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

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

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

–若对象采用 “identity”标识符生成器,则Hibernate无法在JDBC层进行批量插入操作

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

2. 通过HQL批处理:

•注意: HQL只支持INSERTINTO … SELECT形式的插入语句,
但不支持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与批处理的更多相关文章

  1. :Hibernate逍遥游记-第16管理session和实现对话

    1. package mypack; public class Monkey{ private Long id; private String name; private int count; pri ...

  2. Hibernate管理Session和批量操作

    Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hiber ...

  3. hibernate 管理 Session(单独使用session,不spring)

    Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...

  4. Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session

    知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...

  5. hibernate 管理 Session(单独使用session,非spring)

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

  6. Hibernate管理Session

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

  7. 【Hibernate】Hibernate系列8之管理session

    管理session 更简单的,注入对象:

  8. Hibernate 系列 05 - Session 类

    引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...

  9. org.hibernate.HibernateException: No Session found for current thread

    spring.springmvc和hibernate整合 在sessionFactory.getCurrentSession()时,出现以下异常 No Session found for curren ...

随机推荐

  1. java--面向接口编程

    之前看的一本书的笔记,上周再看设计模式的时候,想到了这篇之前在看某本书时候的笔记. 面向接口编程很重要的一点就是接口回调,用接口声明的变量称作接口变量,属于引用型变量,可以存放实现该接口的类的实例的引 ...

  2. ifdebug

    #if DEBUG 首先,大小写不能写错. 其次,解决方案配置设为:Debug,才会执行该语句,如果在条件里面搭配Debug.Assert等,效果甚佳.而如果要设置为Release模式,就不会执行条件 ...

  3. Android Activity形象描述

    Activity就是形象的说就是一个容器,在里面放置各种控件(按钮,文本,复选框等),就形成了软件的界面~ Activity是可见的,如果不加任何控件的话,那么就像Windows中的空白窗体一样 通过 ...

  4. Careerdesign@foxmail.com

    Careerdesign@foxmail.com 相关文章 32岁了,我还有没有机会转行做程序员吗? 如何有效渡过充满迷茫的大学生活 毕业了,我是先择业,还是先就业? 程序员创业,不要把风险带给家人! ...

  5. Linux查看所有用户用什么命令

    用过Linux系统的人都知道,Linux系统查看用户不是会Windows那样,鼠标右键看我的电脑属性,然后看计算机用户和组即可. 那么Linux操作系统里查看所有用户该怎么办呢?用命令.其实用命令就能 ...

  6. 【转】win7(windows7)下java环境变量配置方法

    原文网址:http://jingyan.baidu.com/article/925f8cb836b26ac0dde0569e.html win7(windows7)下java环境变量配置方法,java ...

  7. 【转】android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程.   流程概述: 1.打包资源文件,生成 ...

  8. JavaEE参考示例 SpringSide 4.0 GA版杀青

    SpringSide是以Spring Framework为核心的,Pragmatic风格的JavaEE应用参考示例,是JavaEE世界中的主流技术选型,较佳实践的总结与演示. 经过漫长的7个月和6个R ...

  9. RecordWriter接口解析

    RecordWriter是将Map/Reduce结果(Key-Value)输出到文件系统中. /** * <code>RecordWriter</code> writes th ...

  10. delete drop truncate

    一.相同点 1 truncate.不带where子句的delete.drop都会删除表内的数据2 drop.truncate都是DDL语句(数据定义语言),执行后会自动提交 二.不同点 1trunca ...