golang mysql批量插入例項

2021-10-25 14:45:23 字數 1194 閱讀 8652

業務邏輯:

tcp接收訊息後,先將訊息儲存到資料庫再進行後續操作。

問題:壓測發現,tcp連線非常多,訊息更多,每秒10000條訊息時,程式會記憶體溢位。

解決:自然就想到了,問題出在不能及時把訊息處理掉的問題。所以先想能不能加快mysql的處理流程,可以定時批量插入代替及時插入。

思路:1.接收tcp訊息,通多channel傳送到臨時的切片。

2.定時任務,定時將臨時切片的資料批量插入到mysql。

知識點:

1.channel來接收訊息

2.互斥鎖,保證切片操作和mysql插入互斥

3.定時器,定時觸發插入任務

package service

import (

"bytes"

"fmt"

"sync"

"time")/*

問題:mysql連線過多可能導致記憶體溢位

思路:1.使用定時批量更新代替即收即插

2.使用channel,將接受的資訊先留在記憶體中,然後定時,插入資料庫

3.定時器,定時將記憶體中的資料整理後插入

*/var tmpmessage message

var messagemysqlchan chan message

var meslock sync.mutex //使用互斥鎖,保證切片新增和資料庫插入互斥

func init()

/*接收訊息的邏輯

只負責接收訊息

*/func batchmessagereceive() }}

func batch(batchmessage message)

var buffer bytes.buffer

sql := "insert into `t_msg` (`id`,`msg`,`insert_time`) values"

if _, err := buffer.writestring(sql); err != nil

for index, value := range batchmessage else

} err := mysqldb.exec(buffer.string()).error

if err != nil

return}/*

插入的邏輯

*/func batchstarttimer()

}}

mysql 批量插入 Mysql批量插入分析

前言最近發現幾個專案中都有批次插入資料庫的功能,每個專案中批次插入的寫法有一些差別,所以本文打算對mysql的批次插入做乙個詳細的分析。準備1.jdk1.7,mysql5.6.38 2.準備庫和表 測試與分析 下面準備幾種插入的方式來分析優劣 1.statement插入方式 準備資料,然後通過sta...

mybatis批量插入,批量更新

insert into t ingco trade lithium electric product product no,li e product no,transpor report number,msds,transpor report number path,msds path,un tes...

批量插入SQL

sql語句是有長度限制,在進行資料合併在同一sql中務必不能超過sql長度限制,通過max allowed packet配置可以修改,預設是1m,測試時修改為8m。事務需要控制大小,事務太大可能會影響執行的效率。mysql有 innodb log buffer size 配置項,超過這個值會把inn...