go语言实现kv数据库 go语言实现简单kv存储( 三 )


一般来说 , MaxOpenConns设置得越大 , 可以并发执行的数据库查询就越多,连接池本身成为应用程序中的瓶颈的风险就越低 。
但让它无限并不是最好的选择 。默认情况下,PostgreSQL最多100个打开连接的硬限制 , 如果达到这个限制的话,它将导致pq驱动返回”sorry, too many clients already”错误 。
为了避免这个错误 , 将池中打开的连接数量限制在100以下是有意义的 , 可以为其他需要使用PostgreSQL的应用程序或会话留下足够的空间 。
设置MaxOpenConns限制的另一个好处是,它充当一个非常基本的限流器,防止数据库同时被大量任务压垮 。
但设定上限有一个重要的警告 。如果达到MaxOpenConns限制,并且所有连接都在使用中 , 那么任何新的数据库任务将被迫等待 , 直到有连接空闲 。在我们的API上下文中,用户的HTTP请求可能在等待空闲连接时无限期地“挂起” 。因此,为了缓解这种情况,使用上下文为数据库任务设置超时是很重要的 。我们将在书的后面解释如何处理 。
SetMaxIdleConns()方法的作用是:设置池中空闲连接数的上限 。缺省情况下,最大空闲连接数为2 。
理论上,在池中允许更多的空闲连接将增加性能 。因为它减少了从头建立新连接发生概率—,因此有助于节省资源 。
但要意识到保持空闲连接是有代价的 。它占用了本来可以用于应用程序和数据库的内存,而且如果一个连接空闲时间过长 , 它也可能变得不可用 。例如,默认情况下MySQL会自动关闭任何8小时未使用的连接 。
因此,与使用更小的空闲连接池相比,将MaxIdleConns设置得过高可能会导致更多的连接变得不可用,浪费资源 。因此保持适量的空闲连接是必要的 。理想情况下,你只希望保持一个连接空闲,可以快速使用 。
另一件要指出的事情是MaxIdleConns值应该总是小于或等于MaxOpenConns 。Go会强制保证这点,并在必要时自动减少MaxIdleConns值 。
SetConnMaxLifetime()方法用于设置ConnMaxLifetime的极限值 , 表示一个连接保持可用的最长时间 。默认连接的存活时间没有限制 , 永久可用 。
如果设置ConnMaxLifetime的值为1小时 , 意味着所有的连接在创建后,经过一个小时就会被标记为失效连接 , 标志后就不可复用 。但需要注意:
理论上 , ConnMaxLifetime为无限大(或设置为很长生命周期)将提升性能,因为这样可以减少新建连接 。但是在某些情况下 , 设置短期存活时间有用 。比如:
如果您决定对连接池设置ConnMaxLifetime,那么一定要记住连接过期(然后重新创建)的频率 。例如 , 如果连接池中有100个打开的连接,而ConnMaxLifetime为1分钟,那么您的应用程序平均每秒可以杀死并重新创建多达1.67个连接 。您不希望频率太大而最终影响性能吧 。
SetConnMaxIdleTime()方法在Go 1.15版本引入对ConnMaxIdleTime进行配置 。其效果和ConnMaxLifeTime类似,但这里设置的是:在被标记为失效之前一个连接最长空闲时间 。例如,如果我们将ConnMaxIdleTime设置为1小时,那么自上次使用以后在池中空闲了1小时的任何连接都将被标记为过期并被后台清理操作删除 。
这个配置非常有用,因为它意味着我们可以对池中空闲连接的数量设置相对较高的限制,但可以通过删除不再真正使用的空闲连接来周期性地释放资源 。
所以有很多信息要吸收 。这在实践中意味着什么?我们把以上所有的内容总结成一些可行的要点 。
1、根据经验,您应该显式地设置MaxOpenConns值 。这个值应该低于数据库和操作系统对连接数量的硬性限制,您还可以考虑将其保持在相当低的水平,以充当基本的限流作用 。

推荐阅读