本文详细分析了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会自动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的二级缓存

批量插入数据代码演示:

News news = null;

for(int i = 0; i < 10000; i++) {

news = new News();

news.setTitle("--" + i);

session.save(news);

if((i + 1) % 20 == 0) {

session.flush();

session.clear();

}

}

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

希望本文所述对大家的Java程序设计有所帮助。

hibernate java内存一次能取多少条_Hibernate管理Session和批量操作分析相关推荐

  1. java内存 phd文件抓取_您可以从IBM PHD Java堆转储中提取字符串的值吗?

    我有一个来自IBM jvm的PHD格式堆转储,我希望检查一些字符串的值.使用Sun JVM的二进制hprof转储,这是可能的,但是我无法从IBM转储中恢复此信息. 我试过了: >具有IBM DT ...

  2. java内存 phd文件抓取,WAS 常常有heapdump.phd和javacore.txt文件产生

    WAS 经常有heapdump.***.phd和javacore.***.txt文件产生 问题描述: 发现在AppSvr01下面有heapdump.***.phd和javacore.***.txt文件 ...

  3. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

  4. java基础(一):谈谈java内存管理与垃圾回收机制

    看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...

  5. JVM面试题整理-Java内存区域与内存溢出异常、垃圾收集器和内存分配策略

    参考: https://blog.csdn.net/zd836614437/article/details/64126826 https://blog.csdn.net/u011225629/arti ...

  6. Java内存模型和常见的内存溢出类型及解决方案

    Java内存模型与常见的内存溢出 一. Java 运行过程和内存分配 1 Java的平台无关性 2 Java内存模型 2.1Java内存模型图 3 内存结构详解 3.1 元空间(MetaSpace) ...

  7. JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题

    Hibernate的检索方式  Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...

  8. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  9. 32位jdk最大内存_你了解Java 内存区域和GC机制吗?

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

最新文章

  1. go 调用winapi_golang 调用windows API 中文的处理
  2. HDU 5693 D Game 区间dp
  3. 5、android使用意图传递数据之全局变量传递
  4. 哈工程816计算机专业考研资料,哈尔滨工程大学计算机科学与技术学院816计算机专业基础综合(自命题①数据结构,②计算机组成原理)历年考研真题汇编.pdf...
  5. 使用waitgroup控制协程退出
  6. Pandas 文本数据方法 get_dummies()
  7. 【推荐视频】分布式机器学习框架如何助力高维实时推荐系统
  8. Gym - 100623J Just Too Lucky (数位dp)
  9. 这是一篇优雅的Springboot2.0使用手册 1
  10. Eclipse ADT插件版本下载大全
  11. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Ro A. In Search of an Easy Proble
  12. 类似QQ表情的控件 EmotionContainer(原创)
  13. mysql数据库同步解决方案
  14. C#|图像快速傅立叶变换与反变换
  15. 零件加工 贪心 题解
  16. 网页/博客Hexo添加live2d游戏角色看板娘,简易添加,碧蓝航线等live2d新型游戏角色模型(moc3)
  17. 数仓分层(ODS、DWD、DWS、DWT、ADS)和数仓建模
  18. dnf搬砖代码Python_让搬砖变得轻松——python操作excel用的脚本
  19. ajax json 根据邮政编码查地址
  20. 异性交往,高情商的女人,常用这3种方法抓住男人的心

热门文章

  1. shell编程报错:“syntax error near unexpected token `”
  2. 分布式一致性哈希算法
  3. c++实现,对象池 object_pool
  4. Exception in thread “main“ java.lang.NoSuchMethodError: scala.collection.mut
  5. 汇编语言 将a段和b段中的数据依次相加,结果存放在c段中
  6. NumPy之:多维数组中的线性代数
  7. 使用memcache缓存
  8. 安卓学习 之 广播(五)
  9. 满分简便代码——L1-049 天梯赛座位分配 (20分)
  10. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第四章 课后答案