
MyBatis批量操作DML
发布日期:2021-05-07 13:38:28
浏览次数:20
分类:精选文章
本文共 2073 字,大约阅读时间需要 6 分钟。
Hibernate批量插入数据的最佳实践
在Hibernate应用中,批量插入数据是提升性能的重要优化手段。以下是关于批量操作的几种常见方法及其优缺点分析。
一、使用SessionFactory.openSession(ExecutorType.BATCH)的推荐做法
推荐使用sessionFactory.openSession(ExecutorType.BATCH)
来实现批量操作,这种方式适用于大多数数据库。其核心优势在于:
- 预编译SQL一次:只需要编写一次插入语句,后续只需设置参数值即可。
- 简化管理:无需手动执行多次DML语句,降低代码复杂度。
示例代码:
public static void addBatchStudents() throws IOException { String resource = "conf.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession(ExecutorType.BATCH); StudentMapper studentMapper = session.getMapper(StudentMapper.class); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { Student stu = new Student((int)(Math.random()*9000) +1000, "abc", 44, "xx"); studentMapper.addStudent(stu); } long end = System.currentTimeMillis(); System.out.println(end - start); session.commit(); session.close();}
二、不推荐的批量插入方式:拼接SQL
对于某些特定数据库(如Oracle),直接拼接SQL可能更高效。以下是几种常见方法:
使用存储过程或函数:
- 优点:存储过程能够显著提升性能,尤其适用于复杂查询。
- 示例:
-- 存储函数示例create or replace function add_student(p_stuno number, p_stuname varchar) return number asbegin insert into student values(p_stuno, p_stuname); return 1;end;
批量插入多行数据:
- 适用于:MySQL等支持多行插入的数据库。
- 示例:
insert into student(stuno, stuname) values(100, 'zsx'), (200, 'lsx'), (200, 'lsx'), (200, 'lsx');
使用数据库工具:
- 适用于:需要快速批量处理的场景,如Oracle的SQL Loader或数据库迁移工具。
三、数据库常见处理方式
-
Oracle:
-- 示例:批量插入数据insert into student(stuno, stuname)select stu_no, stu_name from student_old;
-
MySQL:
-- 示例:批量插入数据insert into student(stuno, stuname) values(100, 'zsx'), (200, 'lsx'), (200, 'lsx'), (200, 'lsx');
四、注意事项
数据库连接设置:
- 确保
mysql.url
正确配置,尤其是在使用多条数据源时。 - 对于MySQL,建议设置
allowMultiQueries=true
以支持批量插入。
性能优化:
- 合理设置批量处理的大小,避免一次性插入过多数据导致内存不足。
- 对于复杂的批量任务,建议分批次处理,减少数据库压力。
事务管理:
- 使用
session.commit()
手动提交事务,确保数据的持久性。 - 避免在批量操作中使用自动提交模式,以防数据不一致。
五、总结
批量插入数据是一种高效的数据库操作方式,适用于需要快速处理大量数据的场景。在Hibernate应用中,推荐使用ExecutorType.BATCH
模式,既能实现快速批量操作,又能保持代码的简洁性。对于特定数据库(如Oracle、MySQL),可以根据实际需求选择合适的批量插入方式。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月10日 04时50分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(5.1-5.7)
2019-03-06
上周热点回顾(5.29-6.4)
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06
上周热点回顾(2.19-2.25)
2019-03-06
云计算之路-阿里云上:博客web服务器轮番CPU 100%
2019-03-06
云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
2019-03-06
上周热点回顾(3.26-4.1)
2019-03-06
故障公告:IIS应用程序池停止工作造成博客站点无法访问
2019-03-06
【故障公告】极验验证码故障造成无法登录与注册
2019-03-06
上周热点回顾(6.25-7.1)
2019-03-06
【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
2019-03-06
工作半年的思考
2019-03-06
不可思议的纯 CSS 滚动进度条效果
2019-03-06
【CSS进阶】伪元素的妙用--单标签之美
2019-03-06
开始CN的生活
2019-03-06
惊闻NBC在奥运后放弃使用Silverlight
2019-03-06