博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DB2 SQL statement too long or complex.
阅读量:6993 次
发布时间:2019-06-27

本文共 3231 字,大约阅读时间需要 10 分钟。

  hot3.png

前景:DB2数据库、Mybatis、数据插入。

也不知道这样做合不合理。欢迎指导*.*

        INSERT INTO TB_POC_C_PLAN_ALLYEAR(ID,VERSIONS,YEAR,MONTH,PLAN_DATE,WEEK,WEEK_DAT,CAR_ID,ASSEMBLY,COUNT,CREATER,CREATER_DATE,NAME,VERSION_NAME) VALUES        
            (NEXTVAL FOR ID_SEQ,#{item.versions},#{item.year},#{item.month},#{item.planDate},#{item.week},#{item.weekDat},NULL,NULL,#{item.count},#{username},CURRENT DATE,#{item.name},#{item.versionName})            

执行后报错:SQL statement too long or complex. (原因是ibatis动态生成的sql很长)

后来同事说可以使用多线程插入,这里没有使用继承Thread或实现Runable接口,而是使用的Callable<V>接口。

大致的思路是:

  1. 将原来的数据分割成多个子数据集合

  2. 每个子数据集合放到一个线程中执行

  3. 每个线程返回一个值:正常返回0;错误返回-1

  4. 多个线程的返回值和为0则正常,否则抛出异常,执行数据库事务。

线程类如下:

class ConCurrentDB2Insert implements Callable
 {        private List
 parameters;        private String username;        ConCurrentDB2Insert(List
 parameters, String username) {            this.parameters = parameters;            this.username = username;        }        @Override        public Integer call() throws Exception {            try {                dao.batchAddPlan(this.parameters, this.username);            } catch (Exception e) {                e.printStackTrace();                return -1;            }            return 0;        }    }

执行上述类的方法如下:

private boolean execute(String username, List
...args) throws Exception{        ExecutorService exec = Executors.newCachedThreadPool();        int sum = 0;        List
> results = new ArrayList
>();        for (int i = 0; i < args.length; i++) {            results.add(exec.submit(new ConCurrentDB2Insert(args[i], username)));        }        for (Future
 result: results) {            if (result.isDone()) {                sum += result.get();            }        }        exec.shutdown();        return sum==0?true:false;    }

分割数据包的类如下:

/**     * List分割类     * @param 
     */    class ListSplit
 {        private List
 list;        private int pageSize;        private int pageCount;        private int totalCount;        private int m;        private List
[] results;        public ListSplit(List
 list, int pageSize) {            this.list = list;            this.pageSize = pageSize;            this.pageCount = 0;            this.totalCount = list.size();            this.m = totalCount%pageSize;        }        public List
[] split() {            if  (m>0) {                pageCount=totalCount/pageSize+1;            } else {                pageCount=totalCount/pageSize;            }            this.results = new List[pageCount];            for(int i=1;i<=pageCount;i++){                if (m==0) {                    List
 subList= list.subList((i-1)*pageSize,pageSize*(i));                    this.results[i-1] = subList;                } else {                    if (i==pageCount) {                        List
 subList= list.subList((i-1)*pageSize,totalCount);                        this.results[i-1] = subList;                    } else {                        List
 subList= list.subList((i-1)*pageSize,pageSize*(i));                        this.results[i-1] = subList;                    }                }            }            return this.results;        }    }

具体调用方法如下:

try {            this.execute(username, new ListSplit
(parameters, 100).split());        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException();        }

转载于:https://my.oschina.net/oswxl/blog/600763

你可能感兴趣的文章
失恋不等于失败_450
查看>>
交换机端口绑定
查看>>
【C语言】 模拟计算器
查看>>
(C#基本语法)1.符号与标记
查看>>
TCP状态转换--值得学习--方便记忆
查看>>
浅谈前端性能优化
查看>>
经典的GDB调试命令
查看>>
ios禁止横屏
查看>>
Java并发之wait方法
查看>>
淘宝平台架构师谈海量互联网服务技术架构(转载)
查看>>
使用socket进行HTTP调用
查看>>
我的友情链接
查看>>
liunx网络相关配置
查看>>
OGG replicat错误 ORA-01403及解决方案
查看>>
5步教给你如何进行网站排名优化?
查看>>
文件备份代码
查看>>
9.思科交换路由基本命令操作
查看>>
安装第三方YUM源
查看>>
编译安装Mysql5.5数据库软件
查看>>
vue-cli学习——stylus在项目中如何配置
查看>>