连接池
一个基本的连接池在 database/sql 包中已经实现了, 无需对它做过多的控制和检查, 但是这里有些有用的东西你需要知道:
连接池意味着在一个数据库上可能会打开两个连接来分别独立执行两条连续的语句, 这个特征使得一个现象普遍发生, 那就是程序员们时常对他们的代码异常感到困惑. 比如,
LOCK TABLES
语句后跟INSERT
语句会阻塞, 因为LOCK TABLES
和INSERT
两个操作可能被两个连接独立执行, 而INSERT
可能正处于那条没有保持表锁连接上连接是在需要时被创建的, 在池中并没有一条空闲的连接在等待你
默认情况下, 连接的数量没有限制. 如果你一次要做大量的操作, 你可以创建任意数量的连接. 但是这可能引起数据库返回一个
too many connections
的异常Go 1.1 以后, 你可以使用
db.SetMaxIdleConns(N)
来限制池中空闲连接数, 但是这并不会限制池的大小Go 1.2.1 以后, 你可以使用
db.SetMaxOpenConns(N)
来限制数据库的总打开连接数. 不幸的是, 一个死锁的 bug (现已被修复)会阻止db.SetMaxOpenConns(N)
安全地在 1.2 中使用回收连接的速度相当快. 使用
db.SetMaxIdleConns(N)
设置一个比较大的空闲连接数能减少连接的流失, 并且这有助于重复利用连接长时间保持一个空闲连接可能会导致一些问题(比如这个 Issue #257 提到的 Microsoft Azure 上使用 MySQL 的情况). 如果由于连接空闲太久导致你获取连接超时, 请尝试使用
db.SetMaxIdleConns(0)
由于重用长期连接可能会带来一些网络问题, 你也可以通过设置
db.SetConnMaxLifetime(duration)
来指定一个连接的最大重用次数, 这个函数会关闭未使用的连接, 比如那些可能被延迟关闭的过期连接
链接(译者注)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论