我是怎么在每秒内向一百张表分别插入一条数据的

我是怎么在每秒内向一百张表分别插入一条数据的

一、思想

①减少数据库连接,一百张表分别插入一条数据,一秒内执行一百次连接插入肯定是不合适的,所以必须要批量
②线程操作,将执行插入的方法放入线程内,避免主线程的等待

二、配置

现在讲一下mysql+mybatis的批量操作(其他数据库也都支持,实现配置各不相同,可自行查阅)

1、开启mysql的批量操作。yml配置数据库中添加allowMultiQueries=true

url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true

2、mapper.java

Integer insertEntityDataList(@Param("list") List<EntityData> list);

3、mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com...mapper.EntityDataMapper">
    <insert id="insertEntityDataList" parameterType="java.util.List" useGeneratedKeys="true" >
        <foreach collection="list" item="item" index="index" separator=";">
            CREATE TABLE If Not Exists `数据库名`.`dev_${item.动态表名}`(
            `id` int(11) NOT NULL AUTO_INCREMENT,
            -- 省略
            `cread_time` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
            `update_time` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间',
            `del_state` int(1) NULL DEFAULT 0 COMMENT '删除状态  0 删除  1 反之',
            PRIMARY KEY (id)
            ) ENGINE = InnoDB DEFAULT CHARSET=utf8;

            insert into dev_${item.动态表名}
            <trim prefix="(" suffix=")" suffixOverrides="," >
                <if test="item.属性!= null" >
                    表字段,
                </if>
                     cread_time,
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides="," >
                <if test="item.属性 != null" >
                    #{item.属性,jdbcType=DOUBLE},
                </if>
                  now(),
            </trim>
        </foreach>
    </insert>
</mapper>

三、须得一提,提交的mysql数据量如若太大(一般默认大小就够,不够的话可以去设置一下),程序提示如下:

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.
; 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.;
 nested exception is com.mysql.cj.jdbc.exceptions.PacketTooBigException: 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.

翻译

查询数据包太大(5,200,001 > 4,194,304)。您可以通过设置“max_allowed_packet”变量在服务器上更改该值。
;查询包太大(5,200,001 > 4,194,304)。您可以通过设置变量'max_allowed_packet'在服务器上更改该值。
嵌套异常是com.mysql.cj.jdbc.exceptions。PacketTooBigException:用于查询的数据包太大(5,200,001 > 4,194,304)。
您可以通过设置“max_allowed_packet”变量在服务器上更改该值。

四、oracle批量

实际的业务系统里面oracle数据库也用的非常的多,当然,oracle数据库不需要做特殊的配置,但是相应的sql要做变化。

<update id="updateAllAvailable">
    <foreach collection="skuOptionList" item="item" index="index" open="begin" close="end;" separator=";">
      update t_xxx
      <set>
        old_id = #{item.oldId}
      </set>
      where id = #{item.id}
    </foreach>
  </update>
喜欢就关注我吧,我会努力更新的!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值