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

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的更多相关文章
- Hibernate管理Session和批量操作
Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hiber ...
- hibernate 管理 Session(单独使用session,不spring)
Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- hibernate 管理 Session(单独使用session,非spring)
Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- :Hibernate逍遥游记-第16管理session和实现对话
1. package mypack; public class Monkey{ private Long id; private String name; private int count; pri ...
- Hibernate之管理session与批处理
1. Hibernate 自身提供了三种管理Session对象的方法 –Session对象的生命周期与本地线程绑定 –Session 对象的生命周期与JTA事务绑定 –Hibernate 委托程序管理 ...
- Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session
知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...
- 【Hibernate】Hibernate系列8之管理session
管理session 更简单的,注入对象:
- Hibernate Open Session In View模式【转】
来源:http://www.yybean.com/opensessioninviewfilter-role-and-configuration 一.作用 Spring为我们解决Hibernate的Se ...
- [Hibernate 2]session的三种状态
一.Session的特点和获取 特点: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间. Session也称为持久化管理器, ...
随机推荐
- python 并发之进程
一.什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...
- MyEclipse代码提示功能和自动提示功能
1.菜单window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打上勾 ...
- Libevent:1前言
一:libevent概述: libevent是一个用来编写快速.可移植.非阻塞IO程序的库,它的设计目标是:可移植性.高效.可扩展性.便捷. libevent包含下列组件: evutil:对不同平台下 ...
- OSS跨同城3AZ重磅发布,构造全面数据保护体系
点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 OSS跨同城3AZ重磅发布 2019年7月3日15时,OSS跨同城3AZ重磅发布 ...
- 破解fireworks_cs6、phoneshop_cs6、dreamweaver_cs6
我的Adobe密码是绿尘枫加**0,首字母大写,在我的百度云盘有这三款软件的补丁,这三款软件安装和破解的方式都一样.先下载正常安装好正版软件>正常试用一遍之后,fireworks的补丁装错了文件 ...
- linux中$@,$*,$0,$$,$?参数的含义
$# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该shell脚本的第一个参数 $ 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向 ...
- nodeJs学习-06 模块化、系统模块、自定义模块、express框架
系统模块:http://nodejs.cn/api/events.html 自定义模块: require 请求:引入模块 module 模块:批量输出 exports 输出:单独输出 ...
- MySQL性能分析, mysql explain执行计划详解
MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...
- 关于RESTful一些注意事项,和自己整理的接口开发规范
https://blog.csdn.net/u013731455/article/details/56278168 最近在研究restful,公司开发要使用,所以自己就去网上找了好些资料,并整理了一套 ...
- Laravel 5.6 安装 guzzlehttp
环境:Laravel 5.6 安装 composer require guzzlehttp/guzzle 在vendor文件夹下,vendor\guzzlehttp\guzzle 引入 use Gu ...