【java】itoo项目实战之hibernate 批量保存优化
在itoo中。基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中。然后使用导入功能导入的数据库中,这样能够大大的提高工作效率。
那么导入就涉及到了批量保存数据库的问题了。
那么通常情况下,在一个Session对象的缓存中数量有限的持久化对象,等到Session对象处理事务完成,还要关闭Session对象,从而及时释放session的缓存占用的内存。在批量保存1万条数据,假设一次性把须要保存的1万条数据载入到内存职工,当运行事务提交的时候,就会清理缓存,hibernate运行1万条更新语句。
这样更新的方式有两个缺点:
(1)占用大量内存。必须把1万条载入到内存中,然后一一更新它们。
(2)运行的update数目过多,每一个update语句仅仅能更新一条数据,必须通过1万条update语句才干更新1万条数据。频繁地訪问数据库,会大大减少应用的性能。
对于以上的情况。咱们能够通过Session来进行批量操作。Session
的sava方法都会把处理对象的存放在自己的缓存职工,假设通过一个Session对象来处理大量持久化对象,应该及时从缓存中清空已经处理完成而且不会在訪问的对象。
详细的做法就是处理完一个对象或者小批量对象后,立马调用Flush()方法清理缓存,然后再调用Clear()方法清空缓存。
假设通过Session来进行批量操作,会受到下面的约束:
1.须要在hibernate的配置文件里设置JDBC单次批量处理的数目。合理的取值通常为10~50,比如hibernate.jdbc.batch_size=30;这样设置的。就须要保证每次像数据库发送的批量SQL语句数目与这个batch_size属性一致。
2.假设操作对象採用"identity"标识符生成器,则Hibernate无法在JDBC层进行批量插入操作。
3.进行批量操作时。建议关闭hibernate的第二级缓存。Session的缓存为hibernate的第一级缓存,通常它是事务范围内的缓存。每一个事务都有单独的第一级缓存。
SessionFactory的外置缓存为Hibernate的第二级荤菜,它是应用范围内的缓存,全部的事务都共享同一个第二级缓存。在不论什么情况下,hibernate的第一级缓存总是可用的,在默认情况下。hibernate的第二级缓存是关闭的。可是也能够在hibernate的配置文件里手动关闭二级缓存:
Hibernate.cache.use_second_level_cache=false;
在itoo中批量保存的代码例如以下:
<span style="font-family:FangSong_GB2312;font-size:18px;">/**
* 批量保存
*
* @param list
* list类型
* @return 返回boolean值
*/
public <T> boolean saveEntitys(List<T> list) {
boolean flag = false;
int batchSize = 30;
int i = 0;
getDataBaseName(list.get(0));
try {
for (Object entity : list) {
getEntityManager().persist(entity);
i++;
if (i % batchSize == 0) {
getEntityManager().flush();
getEntityManager().clear();
}
}
flag = true;
} catch (Exception e) { }
return flag;
}</span>
在以上的程序中,每次运行session.flush()方法,就会向数据库职工批量插入30条记录。接下来session.clear()方法把20个刚保存的对象从缓存中清空。
仅仅要是设计有批量导入的情况,都会涉及到批量保存的内容,这篇博客就是让你的批量保存达到最优效果。
【java】itoo项目实战之hibernate 批量保存优化的更多相关文章
- 【java】itoo项目实战之hibernate 懒载入优化性能
在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加 ...
- 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询
在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...
- Java Web项目实战第1篇之环境搭建
写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...
- Java高级项目实战03:CRM系统数据库设计
接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...
- Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍
本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...
- Java Drp项目实战——Servlet
由来 在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思.它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的 ...
- Java爬虫项目实战(一)
目的: 通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) .市(City).县(County).镇(town).村委会(village) 主网站链接: http://www.st ...
- JAVA Drp项目实战—— Unable to compile class for JSP 一波三折
交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...
- Java Drp项目实战—— 环境搭建
概要 我们要開始一个关于Java项目的开发,那么我们就须要搭建一个关于Java开发的环境,那么搭建一个Java开发环境,都须要些什么东东,又有些什么注意事项呢. 过程 我先将我搭建Java环境的软件和 ...
随机推荐
- python基础-面向对象(类)
类 类的定义 >>> class P: ... pass ... >>> P <class __main__.P at 0x0000000001F4B ...
- Python内置函数6
Python内置函数6 1.license() 输出当前python 的license信息 A. HISTORY OF THE SOFTWARE ========================== ...
- 2017 Multi-University Training Contest - Team 2
Regular polygon Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- BZOJ 2127 happiness ——网络流
[题目分析] 基本上是第一次真正的使用最小割的模型. 同时加上一个数然后最后再减去是处理负数的一种方法. 设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解. 这 ...
- Codeforces 333E Summer Earnings ——Bitset
[题目分析] 找一个边长最大的三元环. 把边排序,然后依次加入.加入(i,j)时,把i和j取一个交集,看看是否存在,存在就找到了最大的三元环. 输出即可,n^3/64水过. [代码] #include ...
- sqlite-jdbc
sqlite-jdbc驱动下载 https://bitbucket.org/xerial/sqlite-jdbc/downloads import java.sql.*; public class T ...
- 【JQ同胞遍历】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- vue elementUI 表单校验(数组多层嵌套)
在使用vue element-ui form表单渲染的时候,会遇到这样的数据结构: { "title":''123455, "email":'123456@qq ...
- linux 查看自己所在的公网ip
curl members.3322.org/dyndns/getip 其他的方法还有: curl icanhazip.com curl ifconfig.me curl curlmyip.com cu ...
- MySQL导出数据库、数据库表结构、存储过程及函数【用】
一.导出数据库 我的mysql安装目录是D:\Program Files\MySQL\MySQL Server 5.5\bin\,导出文件预计放在D:\sql\ 在mysql的安装目录执行命令: my ...