【发布时间】:2021-10-09 19:03:59
【问题描述】:
背景:我想在我的 Go 应用程序中使用 SQL 数据库时减少响应时间。
Golang 提供了一个带有连接池的 SQL 包。 它包括以下配置选项:
- func (db *DB) SetConnMaxIdleTime(d time.Duration)
- func (db *DB) SetConnMaxLifetime(d time.Duration)
- func (db *DB) SetMaxIdleConns(n int)
- func (db *DB) SetMaxOpenConns(n int)
但是,没有什么比 SetMinIdleConns 更能确保在请求进来时始终有一些打开的连接可以使用。
结果,我的应用程序在负载下具有良好的响应时间,但是在一段时间空闲时间之后的第一个请求总是有一些延迟,因为它需要打开与数据库的新连接。
问题:有没有办法使用 Go 标准库来解决这个问题,或者是否有其他用于 Go 的具有此功能的连接池库?
解决方法并已尝试过:
- 我尝试将
ConnMaxIdleTime和ConnMaxLifetime设置为非常高的值,但随后 SQL 服务器将它们关闭,并且在长时间空闲后第一次调用时出现更高的延迟甚至错误。 - 显然,我可以创建一个定期使用数据库的后台任务。但是,这似乎不是一个干净的解决方案。
- 我正在考虑将连接池库从另一种语言移植到 Go。
【问题讨论】:
-
偶尔几毫秒的延迟似乎不足以保证实现和维护自定义连接池的时间以及始终维护未使用连接的资源。你确定你真的需要这个吗?
-
几毫秒就可以了,但通常要长得多(参见例如stackoverflow.com/questions/57094912/…)。而且不只是偶尔。它发生在一个可能每周使用一次的演示系统上。而在销售产品的演示中,第一印象尤为重要。