golang结合mysql怎么设置最大连接数和最大空闲连接数


关于最大连接数和最大空闲连接数,是定义在golang标准库中database/sql的。

文中例子连接MySQL用的SQL driver package是github.com/go-sql-driver/mysql.

设置最大连接数的接口是

func (db *DB) SetMaxOpenConns(n int)

设置连接MySQL可以打开的最大连接数。

如果n

默认为0,也就是不限制连接数。

另一个与连接数相关的参数是MaxIdleConns,表示最大空闲连接数。

如果MaxIdleConns 大于0,且大于MaxOpenConns,那么将调整MaxIdleConns等于MaxOpenConns,有多余的连接时会关闭多余的连接。

设置最大空闲连接数的接口是:

func (db *DB) SetMaxIdleConns(n int)

当n

默认的最大空闲连接数为2:
const defaultMaxIdleConns = 2

关于打开的连接和空闲的连接之间的关系,补充一下:

打开的连接 = 正在使用的连接(inuse) + 处于空闲状态的连接(idle)

下面对最大连接数和最大空闲连接数做下测试和验证。

1.最大连接数测试

首先设置最大打开的连接数为1,接着开启20个goroutine,每个goroutine执行sql语句,打印执行sql使用的连接的connection id。观察其他需执行 SQL 的 Goroutine 的执行情况,当执行耗时的 SQL 语句占用连接时。

例子代码如下:

package main

import (
        "database/sql"
        "log"

        _ "github.com/go-sql-driver/mysql"
)

var DB *sql.DB
var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true"

func Init() {
        var err error
        DB, err = sql.Open("mysql", dataBase)
        if err != nil {
                log.Fatalln("open db fail:", err)
        }

        DB.SetMaxOpenConns(1)

        err = DB.Ping()
        if err != nil {
                log.Fatalln("ping db fail:", err)
        }
}

func main() {
        Init()
        
        //开启20个goroutine
        for i:=0; i < 20; i++ {
                go one_worker(i)
        }
        
        select {
        }

}

func one_worker(i int) {
        var connection_id int
        err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id)
        if err != nil {
                log.Println("query connection id failed:", err)
                return
        }

        log.Println("worker:", i, ", connection id:", connection_id)

        var result int
        err = DB.QueryRow("select sleep(10)").Scan(&result)
        if err != nil {
                log.Println("query sleep connection id faild:", err)
                return
        }

}

output

2019/10/02 18:14:25 worker: 2 , connection id: 55
2019/10/02 18:14:25 worker: 17 , connection id: 55
2019/10/02 18:14:25 worker: 11 , connection id: 55
2019/10/02 18:14:35 worker: 3 , connection id: 55
2019/10/02 18:14:45 worker: 0 , connection id: 55
2019/10/02 18:14:45 worker: 4 , connection id: 55
2019/10/02 18:14:45 worker: 5 , connection id: 55
2019/10/02 18:15:05 worker: 7 , connection id: 55
2019/10/02 18:15:25 worker: 15 , connection id: 55
2019/10/02 18:15:25 worker: 6 , connection id: 55
2019/10/02 18:15:35 worker: 13 , connection id: 55
2019/10/02 18:15:45 worker: 19 , connection id: 55
2019/10/02 18:15:45 worker: 10 , connection id: 55
2019/10/02 18:15:45 worker: 12 , connection id: 55
2019/10/02 18:15:55 worker: 14 , connection id: 55
2019/10/02 18:16:15 worker: 8 , connection id: 55
2019/10/02 18:16:35 worker: 18 , connection id: 55
2019/10/02 18:16:35 worker: 1 , connection id: 55
2019/10/02 18:17:05 worker: 16 , connection id: 55
2019/10/02 18:17:35 worker: 9 , connection id: 55

使用show processlist查看连接

Mootion Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

Mootion 232 查看详情 Mootion
mysql> show processlist;
+----+------+-----------------+------+---------+------+------------+------------------+
| Id | User | Host            | db   | Command | Time | State      | Info             |
+----+------+-----------------+------+---------+------+------------+------------------+
| 20 | root | localhost       | NULL | Query   |    0 | starting   | show processlist |
| 55 | root | localhost:59518 | NULL | Query   |    5 | User sleep | select sleep(10) |
+----+------+-----------------+------+---------+------+------------+------------------+
2 rows in set (0.00 sec)

使用netstat 查看连接

netstat -an | grep 3306
tcp4       0      0  127.0.0.1.3306         127.0.0.1.59518        ESTABLISHED
tcp4       0      0  127.0.0.1.59518        127.0.0.1.3306         ESTABLISHED
tcp46      0      0  *.3306                 *.*                    LISTEN

从结果可以看到,20个goroutine轮流使用同一个连接(connection id 为55)执行sql语句。

其他goroutine在连接被占用时会进入阻塞状态。直到连接使用完后,其他goroutine才可以使用连接。

即使多个goroutine在执行SQL,也没有创建多个连接。

因此,最大连接数设置生效。

有些读者可能会问,没有看到设置最大空闲连接数,此时最大空间连接数是多少?

前面已经提到,默认的最大空闲连接数是2.

下面再来测试下最大空间连接数。

2.最大空闲连接数测试

下面例子中,设置最大连接数为1,最大空闲连接数为0.

并且每隔3s执行一条SQL语句。

代码如下:

package main

import (
        "database/sql"
        "log"
        "time"

        _ "github.com/go-sql-driver/mysql"

)

var DB *sql.DB
var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true"

func mysqlInit() {
        var err error
        DB, err = sql.Open("mysql", dataBase)
        if err != nil {
                log.Fatalln("open db fail:", err)
        }

        DB.SetMaxOpenConns(1)
        DB.SetMaxIdleConns(0)

        err = DB.Ping()
        if err != nil {
                log.Fatalln("ping db fail:", err)
        }
}

func main() {
        mysqlInit()

        for {
                execSql()
                time.Sleep(3*time.Second)
        }
}


func execSql() {
        var connection_id int
        err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id)
        if err != nil {
                log.Println("query connection id failed:", err)
                return
        }

        log.Println("connection id:", connection_id)
}

output:

2019/10/13 23:06:00 connection id: 26
2019/10/13 23:06:03 connection id: 27
2019/10/13 23:06:06 connection id: 28
2019/10/13 23:06:09 connection id: 29
2019/10/13 23:06:12 connection id: 30
2019/10/13 23:06:15 connection id: 31
2019/10/13 23:06:18 connection id: 32
2019/10/13 23:06:21 connection id: 33
2019/10/13 23:06:24 connection id: 34
2019/10/13 23:06:27 connection id: 35
2019/10/13 23:06:30 connection id: 36
2019/10/13 23:06:33 connection id: 37
2019/10/13 23:06:36 connection id: 38

从结果中可以看出,每次执行SQL使用的连接connection id都不同。

设置最大空闲连接数为0,每次执行SQL后,连接不会放入空闲连接池,而是会被关闭,下次执行SQL时,会重新建立新的连接。

以上就是golang结合mysql怎么设置最大连接数和最大空闲连接数的详细内容,更多请关注其它相关文章!


# 才可以  # 湛江网站整站优化  # seo优化培训专业  # 莱芜网络推广seo优化  # 莱芜网站推广方案  # 事件营销的推广案列  # 农产品推广官方网站  # seo关键词排名皆选14火星  # 廊坊网站建设接单  # 推广系统知名乐云seo  # 教育网站推广方法  # MySQL  # 再来  # 中文网  # 相关文章  # 是一个  # 如何设置  # 多个  # 数为  # 镜像  # 连接数  # Golang 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 苹果手机聊天记录删除了如何恢复  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  金牛福袋获取攻略  泰拉瑞亚水晶无法放置问题  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  《万兴喵影》导出视频方法  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  《微信》视频号原创声明开启方法  在Django中动态检查模型关联:一种灵活的解决方案  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  小红书网页版怎么进 小红书网页版通用入口  《via浏览器》强制缩放网页设置方法  c++中的const关键字用法大全_c++ const正确使用指南  4399正版网页版入口高清直达链接  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  个人所得税办理入口 个人所得税综合所得年度汇算入口  管理打开的编辑器:固定、分组和关闭技巧  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  WPS文字如何进行简繁转换  C++ static关键字作用_C++静态成员变量与静态函数  偃武诸葛亮阵容搭配推荐  《广发易淘金》国债逆回购操作教程  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  易车网官网直达入口 易车网在线登录入口  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  Python实战:高效处理实时数据流中的最小/最大值  餐馆菜篮选购指南  解决jQuery多计算器输入字段冲突的教程  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  使用 J*aScript 随机化 CSS Grid 布局中的元素顺序  阿里云共享相册入口在哪  Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法  海棠阅读网页版_进入海棠网页版在线阅读中心  B站怎么快速升级 B站用户等级提升攻略【详解】  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  《磁力猫》最好用的磁官网  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  Highcharts雷达图轴线交点数值标注指南  React应用中Commerce.js数据加载与状态管理最佳实践  顺丰快递收费标准查询_如何查看顺丰最新收费价格  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  《爱笔思画x》涂色教程  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  《星露谷物语》克林特好感度事件介绍 

 2023-06-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.