环境: mybatis  + oracle11g r2

1.使用"直接路径插入"(以下sql语句中的"/*+append_values */"),而且使用keyword"union all":

<insert id="addUidCodeBatch"  parameterType="java.util.List">
insert into /*+append_values */
T_UID_CODE(C_UID_CODE,
C_SERAIL_LEN,
C_BATCH_CODE,
C_TYPE,
C_CREATE_TIME,
C_SUPER_CODE,
c_security_code,
C_SERIAL_CODE
)
<foreach collection="list" item="item" index="index" separator="union all" >
select #{item.uidCode},
#{item.kCode},
#{item.batchCode},
#{item.type},
sysdate,
#{item.superCode},
#{item.securityCode},
#{item.serialCode}
from dual
</foreach>
</insert>

2.dao层实现:   之前是一次性commit,这样做会随着插入数目的增大,运行速度陡然变慢,所以应该分批次进行插入:

	public void save(List<UidCodeBean> uidCodeList) throws Exception {
SqlSession batchSqlSession = null;
try {
batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);//获取批量方式的sqlsession
int batchCount = 1000;//每批commit的个数
int batchLastIndex = batchCount - 1;//每批最后一个的下标
for(int index = 0; index < uidCodeList.size()-1;){
if(batchLastIndex > uidCodeList.size()-1){
batchLastIndex = uidCodeList.size() - 1;
batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex));
batchSqlSession.commit();
System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex);
break;//数据插入完成,退出循环 }else{
batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit();
System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex);
index = batchLastIndex + 1;//设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
}
}finally{
batchSqlSession.close();
}
}

mybatis批量插入oracle大量数据记录性能问题解决的更多相关文章

  1. mybatis批量插入oracle时报错:unique constraint (table name) violated

    mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.

  2. 一次EF批量插入多表数据的性能优化经历

    距离上次的博客已经有15个多月了,感慨有些事情还是需要坚持,一旦停下来很有可能就会停很久或者从此再也不会坚持.但我个人一直还坚持认为属于技术狂热份子,且喜欢精益求精的那种.最近遇到两个和数据迁移相关的 ...

  3. mybatis批量插入oracle

    <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO TEST( ...

  4. Mybatis批量插入oracle,mysql

    oracle  <insert id="addUserData" parameterType="java.util.List"> INSERT IN ...

  5. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  6. oracle+mybatis批量插入踩坑记

    最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下: 一.常用的两种sql写法报错 1.insert ... values ... <insert ...

  7. Mybatis 批量插入数据

    --mybatis 批量插入数据 --1.Oracle(需要测试下是否支持MySQL) < insert id ="insertBatch" parameterType=&q ...

  8. MyBatis批量插入性能及问题

    1.mybatis三种批量插入方式对比 2.Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 3.Mybatis批量插入引发的血案 4.Oracle批量插入数据SQL语句太长出错

  9. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

随机推荐

  1. C++异常与析构函数及构造函数

    析构函数不要抛出异常. 构造函数可以抛出异常,但是要谨慎. 原因下面这篇文章讲的不错,转载如下: http://jarfield.iteye.com/blog/811703 写Java代码的时候,遇到 ...

  2. [Tailwind] Style Elements on hover and focus with Tailwind’s State Variants

    In this lesson, we learn how to target specific states of elements and apply styles only when those ...

  3. hdu3966_树链剖分

    近期在强化知识点深度.发现树链剖分不是非常会写了. 回想一下改动操作: 若两个点在同一条链上,则直接改动这段区间. 若不在同一条链上,改动深度较大的点到其链顶端的区间,同一时候将这个点变为他所在链顶端 ...

  4. 公布项目到NPM

    修己安人,内圣外王 近期,在开发Node项目过程中遇到了须要类jQuery深拷贝对象的问题.去Github找了半天,并没有符合的,于是,自己决定写一个(mixin.js),然后推送到NPM(查看Npm ...

  5. JavaSE 最easy出错的几个简单的问题

    案例1. package cn.itcast.oop; public class ThisDemo { public static void main(String[] args) { Student ...

  6. .NET序列化工具Jil、Json.NET和Protobuf的简单测评

    前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...

  7. BZOJ 3729 splay维护DFS序+博弈论

    思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...

  8. 在centOS 6.5下手动安装nginx1.9.x版本

    第一步:首先安装Nginx的依赖环境    1.安装pcre-devel   yum -y install pcre-devel  #支持正则的pcre模块 比如安装 不然手动安装会报错    2.安 ...

  9. MVC bundle配置文件模板

    bundle文件放在应用根目录,命名为  bundle.config 内容模板 <?xml version="1.0" encoding="utf-8"? ...

  10. Java基础——选择排序、冒泡排序

    1.选择排序 原理是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完 代码演示: public class Test3 { public sta ...