1. 程式人生 > 實用技巧 >Mysql 儲存過程中使用遊標迴圈讀取臨時表

Mysql 儲存過程中使用遊標迴圈讀取臨時表

技術標籤:資料庫mysqlmybatis

我是怎麼在每秒內向一百張表分別插入一條資料的

一、思想

①減少資料庫連線,一百張表分別插入一條資料,一秒內執行一百次連線插入肯定是不合適的,所以必須要批量
②執行緒操作,將執行插入的方法放入執行緒內,避免主執行緒的等待

二、配置

現在講一下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>
喜歡就關注我吧,我會努力更新的!

在這裡插入圖片描述