在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 批量保存优化的更多相关文章

  1. 【java】itoo项目实战之hibernate 懒载入优化性能

    在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加 ...

  2. 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询

    在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...

  3. Java Web项目实战第1篇之环境搭建

    写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...

  4. Java高级项目实战03:CRM系统数据库设计

    接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...

  5. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  6. Java Drp项目实战——Servlet

    由来 在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思.它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的 ...

  7. Java爬虫项目实战(一)

    目的: 通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) .市(City).县(County).镇(town).村委会(village) 主网站链接: http://www.st ...

  8. JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

    交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...

  9. Java Drp项目实战—— 环境搭建

    概要 我们要開始一个关于Java项目的开发,那么我们就须要搭建一个关于Java开发的环境,那么搭建一个Java开发环境,都须要些什么东东,又有些什么注意事项呢. 过程 我先将我搭建Java环境的软件和 ...

随机推荐

  1. Linux rm删除

    将 test1子目录及子目录中所有档案删除 命令: rm -r test1 rm -rf test2命令会将 test2 子目录及子目录中所有档案删除,并且不用一一确认 命令: rm -rf  tes ...

  2. D. Frequent values

    D. Frequent values Time Limit: 3000ms Case Time Limit: 3000ms Memory Limit: 131072KB   64-bit intege ...

  3. 13-数组的API方法遍历

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. [luoguP1053] 篝火晚会(贪心 + 乱搞)

    传送门 假设第一个位置是1,那么枚举它的左右两边是谁,有两种情况,然后可以递推求出序列. 然后可以贪心,两个序列有多少个不同的数,答案就是多少,具体为啥,yy一下即可 然后就是判断递推求出的序列和目标 ...

  5. BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】

    题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数, ...

  6. Little Bird(BZOJ 3831)

    题目大意: 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在第i棵树,那么他可以跳到第i+1,i+2,...,i+k棵树. 如果MHY跳到一棵不矮于当前 ...

  7. java面2

    面试试题汇总集: <[面试题]2018年最全Java面试通关秘籍汇总集!> <[面试题]2018年最全Java面试通关秘籍第二套!> <[面试题]2018年最全Java面 ...

  8. Linux 下 GCC 编译共享库控制导出函数的方法

    通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪 ...

  9. Gradle讲解

    简介: Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. ...

  10. hdu5412CRB and Queries

    动态修改求区间K大. 整体二分是一个神奇的东西: http://www.cnblogs.com/zig-zag/archive/2013/04/18/3027707.html 入门: 一般的主席树都挂 ...