database/sql 包中有一个基本连接池。控制或检查它的能力不多,但您可能会发现以下一些有用的知识:

  • 连接池意味着在单个数据库上执行两个连续的语句可能会打开两个连接并分别执行它们。对于程序员来说,很常见的情况是,他们的代码为什么会发生失常行为。例如,LOCK TABLES 后跟 INSERT 可能会阻塞,这是因为 INSERT 位于一个不持有表锁的连接上。
  • 连接是在需要并且池中没有可用的空闲连接时才创建的。
  • 默认情况下,连接数量没有限制。如果尝试一次执行很多操作,则可以创建任意数量的连接。这可能导致数据库返回错误,例如「连接过多」。
  • 在 Go 1.1 或更高版本中,您可以使用 db.SetMaxIdleConns(N) 来限制池中 空闲 连接的数量。不过,这并不限制池的大小。
  • 在 Go 1.2.1 或更高版本中,您可以使用 db.SetMaxOpenConns(N) 来限制与数据库的 总的 打开连接数。不幸的是,死锁错误(修复) 阻止 db.SetMaxOpenConns(N) 在 1.2 中安全使用。
  • 连接回收速度非常快。使用 db.SetMaxIdleConns(N) 设置大量空闲连接可以减少这种搅动,并有助于保持连接可重复使用。
  • 长时间保持空闲连接会导致问题 (例如 Microsoft Azure 上的 MySQL 中的 这个案例)。如果由于连接空闲时间太长而导致连接超时,请尝试 db.SetMaxIdleConns(0)
  • 您还可以通过设置 db.SetConnMaxLifetime(duration) 指定连接可重用的最长时间,因为重用长时间的连接可能会导致网络问题。这会延迟关闭未使用的连接,即可能会延迟关闭过期的连接。

转自:https://learnku.com/docs/go-database-sql/connection-pool/9483

最后编辑: kuteng  文档更新时间: 2021-11-19 09:19   作者:kuteng