業務邏輯:
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...