golang mysql连接池原理_[Go] golang实现mysql连接池
golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现
一般连接mysql首先需要调用sql.Open函数,但是此时并没有真正的去连接mysql,而是只创建了一个Db的对象而已。当执行Query或者是Exec方法时,才会去真正的连接数据库。
默认情况下。每次执行sql语句,都会创建一条tcp连接,执行结束就会断掉连接,但是会保留两条连接闲置。当下次再执行 sql时,先用闲置的连接,不够的时候再去创建连接。
当设置了Db类下的这两个参数,就可以真正的实现连接池了。
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
SetMaxOpenConns(10)是设置的最大连接数,也就是甭管你多少并发,只能最多创建10条tcp连接,还有要注意的一点是,当执行完sql,连接转移到rows对象上,如果rows不关闭,这条连接不会被放回池里,其他并发获取不到连接会被阻塞住。
SetMaxIdleConns(5)是设置的执行完闲置的连接,这些就算是执行结束了sql语句还是会保留着的
测试的流程是这样的,首先在代码中并发100次执行sql,开一个窗口不停的netstat查看3306端口看tcp连接的情况,可以看到最大就10条tcp连接,执行完后会有5条连接保持住,开一个窗口看tcpdump中3306端口的数据请求情况,在闲置连接的时候,会每10秒传递数据给mysql,使得闲置连接保持住。
mysqlClient.go
先要拉取一下github包,go get github.com/go-sql-driver/mysql
package main
import ("database/sql"
"fmt"
"time"_"github.com/go-sql-driver/mysql")
func main() {
db, _ := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gocron")
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)//连接数据库查询
for i := 0; i < 100; i++{
go func(iint) {
mSql := "select * from user"rows, _ :=db.Query(mSql)
rows.Close()//这里如果不释放连接到池里,执行5次后其他并发就会阻塞
fmt.Println("第", i)
}(i)
}for{time.Sleep(time.Second)
}
}
开一个窗口不停的netstat
while true;do clear;date;netstat -altupn|grep 3306|grep Client;sleep 1;done
开一个窗口tcpdump看闲置连接的请求情况,每隔15秒请求一次数据
tcpdump -i lo port 3306 -vv
golang mysql连接池原理_[Go] golang实现mysql连接池相关推荐
- java 连接池实例_功能完善的Java连接池调用实例
/** * Title: ConnectPool.java * Description: 连接池管理器 * Copyright: Copyright © 2002/12/25 * Company: * ...
- mysql在线检测失败_一则线上MySql连接异常的排查过程
Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题## 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过 ...
- 易语言 mysql查询 中文乱码_大佬们E语言连接MYSQL输出中文乱码怎么破
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 .版本 2 .支持库 mysql .支持库 iext .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 数据库连接句柄 = 连接MySql (& ...
- mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用
概述 MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表.大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据. 了解 ...
- mysql连接access失败_我用工具怎么连接不上mysql数据库的? MySql access denied for user错误...
MySql access denied for user错误 方法/步骤 MySql远程连接时的"access denied for user **@**"错误,搞的我很头大,后来 ...
- mysql版本链图解_图解 SQL 中各种连接 JOIN
先用文字来捋一下思路,数据库操作中无非就是「增删查改」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要分享 ...
- 由浅入深探究mysql索引结构原理_性能分析与优化_由浅入深探究mysql索引结构原理、性能分析与优化...
由浅入深探究mysql索引结构原理.性能分析与优化 第一部分:基础知识第二部分:MYISAM和INNODB索引结构1, 简单介绍B-tree B+ tree树 2, MyisAM索引结构 3, Ann ...
- mysql数据库视图原理_详细分析mysql视图的原理及使用方法
前言: 在MySQL中,视图可能是我们最常用的数据库对象之一了.那么你知道视图和表的区别吗?你知道创建及使用视图要注意哪些点吗?可能很多人对视图只是一知半解,想详细了解视图的同学看过来哟,本篇文章会详 ...
- mysql自然连接和等值连接_区分笛卡儿积,自然连接,等值连接,内连接,外连接...
1.区分笛卡儿积,自然连接,等值连接,内连接,外连接(左连接,右连接和全连接) 假设存在两张表R和S,这里使用的是MySQL数据库. 下面这张表是R 下面这张是S 为了测试左连接和右连接,现在增加一张 ...
最新文章
- 自己编写linux系统,自己动手 编写Linux系统的设备驱动程序
- 制作ubuntu 18.04 U盘启动盘
- 工厂模式(简单工厂、工厂方法、抽象工厂)
- 谷歌浏览器bug调试快捷键_Bug压榨初学者指南:如何使用调试器和其他工具查找和修复Bug
- Ubuntu 安装 Vue.js
- poj1182(并查集)
- 如何将Netbeans配置更加合理
- 帮助中心 开源_如何不获得开源帮助
- python爬虫网页数据案例_python+vue实现网站爬虫数据分析案例
- Unity Occlusion Culling 遮挡剔除研究
- win10 安装db2 10.1 并使用DBserver连接db2数据库
- 体验不尽,进化不止,看视频云技术六大创新
- IOS15.4无法运行WebGL2.0问题
- 哪类人适合学软件测试?零基础能学测试吗?
- Mock测试-优缺点分析
- 图像处理——简单浮雕效果和倒影效果实战
- GDOI2021自闭记
- 什么是图像直方图直方图均衡的原理和作用图像信噪比的概念
- 2022.02.09_Java学习总结_网络编程、正则表达式
- 分层结构的生活例子_分层作业设计案例
热门文章
- 虚拟化 VS 容器化(docker)
- Java Web学习总结(40)——JSP中的Application对象和Session对象常用方法详解
- 50道编程小题目之【完数】
- python百分比堆积条形图_Pandas 堆积条形图中的元素顺序 - python
- linux集群中mpi的并行计算环境简单配置,linux集群中MPI的并行计算环境简单配置...
- java 内部类序列化_Gson如何序列化内部类
- jquery +ajax 上传加预览
- 无人车首例阵亡事件,AI教育春江水暖
- Java : java基础(1)
- 四、shell编程练习题(1-20)