golang mysql批量插入实例
业务逻辑:
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批量插入实例相关推荐
- MYSQL批量插入数据库实现语句性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...
- mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数
MySql 的批量操作,要加rewriteBatchedStatements参数 作者:赵磊 博客:http://elf8848.iteye.com ------------------------- ...
- mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- Mysql批量插入数据问题解决和优化
Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...
- mysql 批量插入亿级数据做测试用
mysql 批量插入亿级数据做测试用 表结构: -- 性能提升 SELECT COUNT(*) from `user`.`user` ; SHOW VARIABLES; set session bu ...
- Mysql批量插入更新性能优化
Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...
- mysql批量插入跟更新_Mysql批量插入和更新的性能
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- node.js中mysql批量插入更新的三种方法
[背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...
- Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)
Mysql 批量插入(5W 条数据和 10W 条数据) 1.批量插入思路 一般是有两种不同的思路: 1.for 循环批量插入 2.生成一条 SQL 语句,比如 insert into user(id, ...
- c mysql 批量插入_c#之mysql四种带事务批量插入
前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...
最新文章
- 舞伴问题数据结构java_Gale-Shapley算法解决舞伴问题过程详解(C++实现)
- 2、RabbitMQ-simplest thing(简单队列)
- BZOJ 3101: N皇后 构造
- Concurrent包下的常用并发类和普通类之间的区别
- 看尽SLAM、ReID和文字识别等技术进展!15位视觉技术大咖齐聚一堂
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
- J2EE 第二阶段项目之编写代码(六)
- WEB前端 屏蔽移动端浏览器页面顶部提示 此网页由网站提供
- java参数传递时,究竟传递的是什么
- 练习:----计算阶乘按钮
- JMockit学习笔记
- 博士申请 | 新加坡国立大学Xinchao Wang老师招收图神经网络方向博士/博后
- 【材料】ABS、ABS+PC、PA、PC、PMMA、POM、PP、PE、PPO、PVC、TPE和TPO材料优缺点
- Edge(Linux 版)无法正常同步问题解决
- hibernate之多对多配置
- 中国商界的顶级秘法之一:民营企业的五层次策划
- 你想要的WinForm界面开发教程在这里 - 如何使用自定义用户控件
- 第一行代码第二版6.4.1小节创建数据库中遇到adb shell出错的问题
- Finger-一款红队在大量的资产中存活探测与重点攻击系统指纹探测工具
- java实现退出重启后保存_JAVA实现关机、重启等