我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > hibernate 批量保存优化
总共48086条微博

动态微博

查看: 1712|回复: 0

hibernate 批量保存优化

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    #
    发表于 2015-08-07 09:49:54 |只看该作者 |正序浏览
    基本上每个系统都有一个导入功能,大量的数据填写进入 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= 3 0; 这样设置的,就需要保证每次像数据库发送的批量 SQL 语句数目与这个 batch_size 属性一致。

    2. 如果操作对象采用 "identity" 标识符生成器,则 Hibernate 无法在 JDBC 层进行批量插入操作。

    3. 进行批量操作时,建议关闭 hibernate 的第二级缓存, Session 的缓存为hibernate 的第一级缓存,通常它是事务范围内的缓存,每个事务都有单独的第一级缓存。 SessionFactory 的外置缓存为 Hibernate 的第二级荤菜,它是应用范围内的缓存,所有的事务都共享同一个第二级缓存。在任何情况下, hibernate 的第一级缓存总是可用的,在默认情况下, hibernate 的第二级缓存是关闭的,但是也可以在 hibernate的配置文件中手动关闭二级缓存:

    Hibernate.cache.use_second_level_cache=false;

    在 itoo 中批量保存的代码如下:

    1. * 批量保存
    2. *
    3. * @param list
    4. *            list类型
    5. * @return 返回boolean值
    6. */
    7. public <T> boolean saveEntitys(List<T> list) {
    8. boolean flag = false;
    9. int batchSize = 30;
    10. int i = 0;
    11. getDataBaseName(list.get(0));
    12. try {
    13. for (Object entity : list) {
    14. getEntityManager().persist(entity);
    15. i++;
    16. if (i % batchSize == 0) {
    17. getEntityManager().flush();
    18. getEntityManager().clear();
    19. }
    20. }
    21. flag = true;
    22. } catch (Exception e) {

    23. }
    24. return flag;
    25. }
    复制代码


    在以上的程序中,每次执行 session.flush() 方法,就会向数据库职工批量插入 30 条记录。接下来 session.clear() 方法把 20 个刚保存的 对象从缓存中清空。

    只要是设计有批量导入的情况,都会涉及到批量保存的内容,这篇博客就是让你的批量保存达到最优效果。



    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表