业务逻辑:

tcp接收消息后,先将消息保存到数据库再进行后续操作。

问题:

压测发现,tcp连接非常多,消息更多,每秒10000条消息时,程序会内存溢出。

解决:

自然就想到了,问题出在不能及时把消息处理掉的问题。所以先想能不能加快mysql的处理流程,可以定时批量插入代替及时插入。

思路:

1.接收tcp消息,通多channel发送到临时的切片。

2.定时任务,定时将临时切片的数据批量插入到mysql。

知识点:

1.channel来接收消息

2.互斥锁,保证切片操作和mysql插入互斥

3.定时器,定时触发插入任务

package serviceimport ("bytes""fmt""sync""time"
)/*
问题:mysql连接过多可能导致内存溢出
思路:
1.使用定时批量更新代替即收即插
2.使用channel,将接受的信息先留在内存中,然后定时,插入数据库
3.定时器,定时将内存中的数据整理后插入
*/var tmpMessage []message
var messageMysqlChan chan message
var mesLock sync.Mutex //使用互斥锁,保证切片添加和数据库插入互斥func init() {messageMysqlChan = make(chan message, 100000)go batchMessageReceive()go batchStartTimer()
}/*
接收消息的逻辑
只负责接收消息
*/
func batchMessageReceive() {for {select {case oneMessage := <-messageMysqlChan:mesLock.Lock()tmpMessage = append(tmpMessage, oneMessage)mesLock.Unlock()}}}func batch(batchMessage []message) {if len(batchMessage) == 0 {fmt.Print("空消息")return}var buffer bytes.Buffersql := "insert into `t_msg` (`id`,`msg`,`insert_time`) values"if _, err := buffer.WriteString(sql); err != nil {fmt.Print(err.Error())}for index, value := range batchMessage {if index == len(batchMessage)-1 {buffer.WriteString(fmt.Sprintf("('%d','%s','%s');", value.Id, value.Mn, value.Msg, value.InsertTime))} else {buffer.WriteString(fmt.Sprintf("('%d','%s','%s'),", value.Id, value.Mn, value.Msg, value.InsertTime))}}err := MysqlDB.Exec(buffer.String()).Errorif err != nil {fmt.Print("插入消息失败:", err.Error())}return
}/*
插入的逻辑
*/
func batchStartTimer() {tick := time.NewTicker(5 * time.Second)for {select {case <-tick.C:mesLock.Lock()batch(tmpMessage)tmpMessage = tmpMessage[0:0] //置空,重复利用切片mesLock.Unlock()}}}

参考博客:

https://www.cnblogs.com/jssyjam/p/11773439.html

golang mysql批量插入实例相关推荐

  1. MYSQL批量插入数据库实现语句性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...

  2. mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数

    MySql 的批量操作,要加rewriteBatchedStatements参数 作者:赵磊 博客:http://elf8848.iteye.com ------------------------- ...

  3. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  4. Mysql批量插入数据问题解决和优化

    Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...

  5. mysql 批量插入亿级数据做测试用

     mysql 批量插入亿级数据做测试用 表结构: -- 性能提升 SELECT COUNT(*) from `user`.`user` ; SHOW VARIABLES; set session bu ...

  6. Mysql批量插入更新性能优化

    Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...

  7. mysql批量插入跟更新_Mysql批量插入和更新的性能

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  8. node.js中mysql批量插入更新的三种方法

    [背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...

  9. Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)

    Mysql 批量插入(5W 条数据和 10W 条数据) 1.批量插入思路 一般是有两种不同的思路: 1.for 循环批量插入 2.生成一条 SQL 语句,比如 insert into user(id, ...

  10. c mysql 批量插入_c#之mysql四种带事务批量插入

    前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...

最新文章

  1. 舞伴问题数据结构java_Gale-Shapley算法解决舞伴问题过程详解(C++实现)
  2. 2、RabbitMQ-simplest thing(简单队列)
  3. BZOJ 3101: N皇后 构造
  4. Concurrent包下的常用并发类和普通类之间的区别
  5. 看尽SLAM、ReID和文字识别等技术进展!15位视觉技术大咖齐聚一堂
  6. WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
  7. J2EE 第二阶段项目之编写代码(六)
  8. WEB前端 屏蔽移动端浏览器页面顶部提示 此网页由网站提供
  9. java参数传递时,究竟传递的是什么
  10. 练习:----计算阶乘按钮
  11. JMockit学习笔记
  12. 博士申请 | 新加坡国立大学Xinchao Wang老师招收图神经网络方向博士/博后
  13. 【材料】ABS、ABS+PC、PA、PC、PMMA、POM、PP、PE、PPO、PVC、TPE和TPO材料优缺点
  14. Edge(Linux 版)无法正常同步问题解决
  15. hibernate之多对多配置
  16. 中国商界的顶级秘法之一:民营企业的五层次策划
  17. 你想要的WinForm界面开发教程在这里 - 如何使用自定义用户控件
  18. 第一行代码第二版6.4.1小节创建数据库中遇到adb shell出错的问题
  19. Finger-一款红队在大量的资产中存活探测与重点攻击系统指纹探测工具
  20. java实现退出重启后保存_JAVA实现关机、重启等

热门文章

  1. 编译原理与编译构造 LR文法
  2. TCPUDP调试工具 Linux 版
  3. 音频传输中的I2S协议
  4. android 10 无线 电脑模式,Win10电脑和安卓手机无线互投教程
  5. 前台CSS颜色代码大全
  6. 技术分享PPT整理(一):Bootstrap基础与应用
  7. Lodop打印控件的学习
  8. 基于51单片机及ADC0808的数字电压表数码管汇编语言proteus仿真程序设计
  9. Altium Designer画PCB详细教程
  10. Mat拜耳数据邻域转换算法返回Mat对象,16bit三通道