一、思想
①减少数据库连接,一百张表分别插入一条数据,一秒内执行一百次连接插入肯定是不合适的,所以必须要批量
②线程操作,将执行插入的方法放入线程内,避免主线程的等待
二、配置
现在讲一下mysql+mybatis的批量操作(其他数据库也都支持,实现配置各不相同,可自行查阅)
1、开启mysql的批量操作。yml配置数据库中添加allowMultiQueries=true
1 url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
2、mapper.java
1 Integer insertEntityDataList(@Param("list") List<EntityData> list);
3、mapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="com...mapper.EntityDataMapper"> 4 <insert id="insertEntityDataList" parameterType="java.util.List" useGeneratedKeys="true" > 5 <foreach collection="list" item="item" index="index" separator=";"> 6 CREATE TABLE If Not Exists `数据库名`.`dev_${item.动态表名}`( 7 `id` int(11) NOT NULL AUTO_INCREMENT, 8 -- 省略 9 `cread_time` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间', 10 `update_time` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间', 11 `del_state` int(1) NULL DEFAULT 0 COMMENT '删除状态 0 删除 1 反之', 12 PRIMARY KEY (id) 13 ) ENGINE = InnoDB DEFAULT CHARSET=utf8; 14 15 insert into dev_${item.动态表名} 16 <trim prefix="(" suffix=")" suffixOverrides="," > 17 <if test="item.属性!= null" > 18 表字段, 19 </if> 20 cread_time, 21 </trim> 22 <trim prefix="values (" suffix=")" suffixOverrides="," > 23 <if test="item.属性 != null" > 24 #{item.属性,jdbcType=DOUBLE}, 25 </if> 26 now(), 27 </trim> 28 </foreach> 29 </insert> 30 </mapper>
三、须得一提,提交的mysql数据量如若太大(一般默认大小就够,不够的话可以去设置一下),程序提示如下:
1 Packet for query is too large (5,200,001 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable. 2 ; Packet for query is too large (5,200,001 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.; 3 nested exception is com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (5,200,001 > 4,194,304). 4 You can change this value on the server by setting the 'max_allowed_packet' variable.
翻译
1 查询数据包太大(5,200,001 > 4,194,304)。您可以通过设置“max_allowed_packet”变量在服务器上更改该值。 2 ;查询包太大(5,200,001 > 4,194,304)。您可以通过设置变量'max_allowed_packet'在服务器上更改该值。 3 嵌套异常是com.mysql.cj.jdbc.exceptions。PacketTooBigException:用于查询的数据包太大(5,200,001 > 4,194,304)。 4 您可以通过设置“max_allowed_packet”变量在服务器上更改该值。
四、oracle批量
实际的业务系统里面oracle数据库也用的非常的多,当然,oracle数据库不需要做特殊的配置,但是相应的sql要做变化。
1 <update id="updateAllAvailable"> 2 <foreach collection="skuOptionList" item="item" index="index" open="begin" close="end;" separator=";"> 3 update t_xxx 4 <set> 5 old_id = #{item.oldId} 6 </set> 7 where id = #{item.id} 8 </foreach> 9 </update>