小心#Golang#官方文档中没有详细说明的陷阱
近日在高负载时使用 Golang 的 sql driver 时碰到泄漏问题,最后终于发现 database/sql 的文档和 Examples 都没有很好的说明下面2个关键点:
一、 每个 Golang 进程只需要 sql.Open() 一次
最 初,想当然的做法是每次有sql请求都先 sql.Open() 。 这实际上是不对的。 database/sql 自己会维护连接池,每次 sql.Open() 会新建一套连接池。虽然不会报错,但是会导致资源浪费。而且我发现在系统资源紧张时会导致锁死的 goroutine 释放不掉, sql.DB.Close() 也未能解决。
二、 每次 Query() 之后,一定要记得 Row.Close() 。
Golang 官方文档的Example完全没有关于 Row.Close() 的代码的。实际上 Query() 之后务必要记得 defer rows.Close()。如果不 Close,这个row就一直保持着与当前 connection pool 中的 sql 连接的依赖关系,连接也就不会被释放。最终导致资源不必要的堆积,甚至崩溃!
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil { log.Fatal(err) }
defer rows.Close() // 文档中没有提及的部分
----
上面两种不当使用的情形并不会导致代码报错,但在负载高时就会产生泄漏。祝 #golang 爱好者不要重蹈我的覆辙。
相关推荐
golang 中文离线文档,直接解压,运行pkgdoc.exe后,会跳出本地文档地址,默认127.0.0.1:9999
第二点是Golang当中自带了map类型,像是java以及C++虽然也有map,但是都不是原生支持的,而是必须要通过引入包才可以使用的 第一种方式最复杂,我们不
Go语言标准库文档中文版,通过对Golang中文社区网站文档下载、分析、提取、整理后生成的chm文档,有结构,有索引,引用全部是本地生成的页面,方便快捷,希望能够给golang开发者提供便利。 因为文档太多,所以全部是...
golang中文手册.chm,学习golang语言的字典,一典在手,天下我有
Golang中文API,由热心网友翻译上传
零基础学习golang,或者有一定语言基础的人转go,描述了go的常用用法
设计模式1. 单利模式// 创建全局对象// 同步Once,保证每次调用时,只有第一次生效// 定义一个包级别的Public实例变量//初始化单利对象2. 观察
通过images创建,负责app的运行cmd和entrypoint的区别:cmd : 容器启动时默认执行,可以被docker run后面的命令覆盖entrypo
golang中文手册.rar
代码地址::len:1 cap: 1 array ptr: 0x41602
一款Golang实现的在线文档系统源码.zip
2020年9月15日最新版本,go语言标准库中文手册,包含 标准库,其它包,子代码库 已生成chm,方便查找
一 死锁常见会出现死锁的场景:- 两个协程互相要求对方先操作,如:AB相互要求对方先发红包,然后自己再发- 读写双方相互要求对方先执行,自己后执行模拟死锁:x
1.1 关键字(25个) 1.2 预定义名字(30+个) 2.1 变量声明 2.2 多变量声明 2.3 零值机制 2.4 变量值互换 2.5 _丢弃变量 2.6
1、restartPolicy, Always, OnFailure, Never 重启容器 2、有两种健康检查, Liveness 活性检查、Readines
2、暴露端口,如何查看 k8s 集群上/node 上暴露了哪些端口 4、共享节点的网络和名称空间 5、标签与标签选择器 Label Selector 6、标签选
实现实现逻辑如下://LimitRate 限速type LimitRate struct {func (l *LimitRate) Limit() bool {
Golang gin 中文文档 架构
app.Action = func(c *cli.Context) error {也可以支持参数,标识等等,具体查看文档mkideal/cli 简单命令行使用文
// 普通调用// 反射调用基准测试结果:使用 reflect.Value0f(2)将 2构造为反射值对象, 因为反射函数调用的参数必须全是反射值对象, 再使用