当前位置: 首页 > news >正文

Hibernate批量操作详解及最优实践

一、Hibernate批量操作基础

Hibernate提供了多种批量处理数据的方式,主要包括:

  1. Session批量操作‌:通过Session的save/update/delete方法进行批量处理
  2. HQL批量操作‌:使用HQL语句进行批量更新/删除
  3. 原生SQL批量操作‌:通过原生SQL进行批量处理
  4. StatelessSession‌:无状态会话,适合大批量数据处理

二、批量操作实现方式

1. Session批量插入

如历史附件中所示,可以通过Session进行批量插入:

@Transactional(rollbackFor = Exception.class)
public void batchInsert(List<UserRole> userRoles) {Session session = sessionFactory.getCurrentSession();for (int i = 0; i < userRoles.size(); i++) {session.save(userRoles.get(i));if (i % 50 == 0) { // 每50条flush一次session.flush();session.clear();}}
}

2. HQL批量更新/删除

@Transactional
public int batchUpdateRoleName(String oldName, String newName) {String hql = "update UserRole set roleName = :newName where roleName = :oldName";return session.createQuery(hql).setParameter("newName", newName).setParameter("oldName", oldName).executeUpdate();
}

3. 原生SQL批量操作

如历史附件中所示,可以结合JdbcTemplate进行批量操作:

public void batchInsertWithJdbc(List<UserRole> userRoles) {String sql = "INSERT INTO WXD_USER_ROLE(ID,ROLENAME,ROLEINFO) VALUES (?,?,?)";jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {UserRole role = userRoles.get(i);ps.setString(1, role.getId());ps.setString(2, role.getRoleName());ps.setString(3, role.getRoleInfo());}@Overridepublic int getBatchSize() {return userRoles.size();}});
}

三、批量操作最优实践

  1. 合理设置batch_size‌:

    • 在hibernate配置中设置:hibernate.jdbc.batch_size=50
    • 值不宜过大,一般20-50为佳
  2. 定期清理缓存‌:

    • 在批量操作中定期调用session.flush()session.clear()
    • 防止一级缓存过大导致内存溢出
  3. 使用StatelessSession‌:

    • 不维护一级缓存和二级缓存
    • 适合纯批量插入场景
  4. 事务管理‌:

    • 确保批量操作在事务中执行,如历史附件中的@Transactional注解
    • 明确指定回滚规则:@Transactional(rollbackFor = Exception.class)
  5. 异常处理‌:

    • 不要捕获异常后不处理,如历史附件中throw e确保事务回滚
    • 对于批量操作,建议记录失败记录后继续处理剩余数据
  6. 混合模式优化‌:

    • 对于复杂场景,可以像历史附件中那样混合使用Hibernate和JDBC
    • 但需确保使用同一个事务管理器

四、性能对比与选择建议

方式适用场景性能内存消耗复杂度
Session批量中小批量,对象完整操作
HQL批量批量更新/删除
原生SQL大批量插入最高最低
StatelessSession大批量插入

选择建议‌:

  • 1万条以下:使用Session批量+合理batch_size
  • 1万-10万条:考虑StatelessSession或混合模式
  • 10万条以上:建议使用原生SQL批量处理

http://www.dtcms.com/a/403315.html

相关文章:

  • 住房与建设部网站如何修改dns 快速使用境外网站
  • 【复习】计网每日一题--PPP链路
  • cpt和pretrain的差别,IFT和SFT的差别是怎么样的
  • RTX5060 Ti显卡安装cuda版本PyTorch踩坑记录
  • MongoDB数据类型与python操作
  • 脑电模型实战系:脑电模型进阶-构建一个高效的全连接网络
  • 东莞网站建设怎么收费展会布置效果图
  • 滕滕州网站建设住房和建设局官网
  • Vue调用本地EXE程序
  • Vue2 全局事件总线:通俗易懂 + 简单案例
  • Flask模板中使用Vue、ant-design-vue、@ant-design/icons-vue示例模板
  • 石狮建设局网站保定网站建设系统
  • vLLM PD分离推理服务配置指南
  • C++ 学习与 CLion 使用:(十五)多文件编程,和C语言一样的多文件编程
  • BEAT币
  • 淘宝的网站怎么做公司网站如何被收录
  • Ansible实现自动化运维
  • Zabbix7.4.8(三):通过Zabbix agent 2监控Docker相关指标
  • 小型个人网站制作网页打不开的原因及解决方法
  • Ansible 入门到实战:自动化运维的瑞士军刀
  • 嵌入式学习---(linux驱动)
  • k8s集群与gitlab registry连接
  • MySQL笔记---对表的操作
  • 【实战避坑】MySQL修改表字段长度完整指南:从语法、锁表机制到在线DDL详解
  • 乐峰网网站是谁做的海门住房和城乡建设局网站
  • 做公司简介的开源网站做网站推广前途
  • 了解学习Nginx反向代理与缓存功能
  • 【黑马程序员】后端Web基础--Maven基础和基础知识
  • Linux系统Nginx服务(三)
  • 新手向 算法 基数排序-yang