编写连接池

时间:2014-10-22 08:59:33

标签: go

如何为数据库编写连接。 令人敬畏的包Redis为缓存redis数据库连接提供了类型池。

如何编写这种缓存数据库连接的连接池?

1 个答案:

答案 0 :(得分:1)

这些是redis.Pool的导出字段:

type Pool struct {
    Dial         func() (Conn, error)
    TestOnBorrow func(c Conn, t time.Time) error
    MaxIdle      int
    MaxActive    int
    IdleTimeout  time.Duration
}
  • Dial需要按需创建新连接。也就是说,当池已经将其所有连接都撤出并且从它请求新的连接时。
  • TestOnBorrow会在连接到用户之前检查连接的运行状况。如果它返回错误,将创建一个新连接(使用Dial),旧连接将被关闭/丢弃。
  • MaxIdle是池中包含的未归属连接数。如果池有这么多连接,则池不会创建任何新连接(通过Dial)。
  • MaxActive是池在任何给定时间管理的总连接数。 Lended加上没有联系。
  • IdleTimeout是一个持续时间,在该持续时间之后,已经在游泳池中未连接的连接将被关闭,而新的连接将在其中打开。

我使用“借贷”这个词而不是“借用”,因为数据流动的方向(谁提供和谁在消费)更清晰。

要实现这样的池,您还需要包装您的连接(就像redis包那样),以便在用户对它们调用Close()时将它们返回到池中。此外,每个连接都保留一个读/写时间戳,以提供空闲超时功能。

为了同时使用,您还需要提供连接的访问​​锁定和原子计数,以便永远不会超过最大空闲/活动连接数。

redis连接池管理的实际连接集保存在list.List的{​​{1}}字段的Pool结构中。