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的二级缓存
  批量插入数据代码演示:

 1 News news = null;
2 for(int i = 0; i < 10000; i++) {
3 news = new News();
4 news.setTitle("--" + i);
5
6 session.save(news);
7 if((i + 1) % 20 == 0) {
8 session.flush();
9 session.clear();
10 }
11 }

批量更新:在进行批量更新时,如果一下子把所有对象都加载到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的事件处理系统忽略掉

Hibernate管理Session的更多相关文章

  1. Hibernate管理Session和批量操作

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

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

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

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

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

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

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

  5. Hibernate之管理session与批处理

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

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

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

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

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

  8. Hibernate Open Session In View模式【转】

    来源:http://www.yybean.com/opensessioninviewfilter-role-and-configuration 一.作用 Spring为我们解决Hibernate的Se ...

  9. [Hibernate 2]session的三种状态

    一.Session的特点和获取 特点: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间.  Session也称为持久化管理器, ...

随机推荐

  1. oracle函数的分类

    v  单行函数:对每一行输入值进行计算,得到相应的计算结果,返回给用户,也就是说,每行作为一个输入参数,经过函数计算得到每行的计算结果. 比如select length(ename) from emp ...

  2. 【数据库】sql2008卸载和默认实例的删除 标签: 数据库 2014-11-16 15:15 5878人阅读 评论(30)

    在安装sql2008的时候,会碰到这一步,要求创建实例,可以选择默认实例和命名实例,如果是第一次安装的话,可以选择默认实例,但是如果是第二次甚至更多次安装的 话,很多时候会出现不能用默认实例,只能自己 ...

  3. idea 启动一直一直build以及勉勉强强的解决方案

    周日做了一个密匙解析的功能,在idea的springboot项目的该类上写了个main方法测试,当时一直提示build,没在意,直接打开eclipse上写 今天早上发现 idea启动springboo ...

  4. TensorFlow 中的卷积网络

    TensorFlow 中的卷积网络 是时候看一下 TensorFlow 中的卷积神经网络的例子了. 网络的结构跟经典的 CNNs 结构一样,是卷积层,最大池化层和全链接层的混合. 这里你看到的代码与你 ...

  5. @codeforces - 1205C@ Palindromic Paths

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...

  6. 6、mysql的安装

    1.安装mysql-Server,并输入root密码 sudo apt-get install mysql-server 2.安装mysql客户端 sudo apt-get install mysql ...

  7. oracle函数 exp(y)

    [功能]返回e的y次幂(e为数学常量) [参数]y,数字型表达式 [返回]数字 [示例] select exp(3),exp(0),exp(-3) from dual; 返回:20.0855369,1 ...

  8. php函数nl2br的反函数br2nl

    真是搞不明白,php里有nl2br这样的好函数,但是为什么就没有它的反函数呢?只好自己在网站找了一个br2nl.分两个版本:php和javascript的. php版的代码如下: function b ...

  9. Cutting Bamboos 主席树+二分+前缀和

    二分第x次砍的位置,然后用线段树查询小于这个位置的数的个数和值的和.然后判断即可 注意!!!主席树是通过动态开点实现的,本身已经不用再从1开始了,而本题开的范围也应该是0,100000 而不是1,10 ...

  10. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminative ...