本文翻译自《Managing connections》。
目录
对于绝大多数程序,你都无需调整sql.DB
连接池的默认值。但对于某些高级程序,你可能需要调整连接池参数或显式地处理连接。本文教你如何操作。
sql.DB
数据库句柄对于多个goroutine并发使用是安全的(这意味着该句柄是其他编程语言可能称之为“线程安全(thread-safe)”的)。其他一些数据库访问库基于每次只能进行一个操作的数据库连接方式。为了弥补这一差距,每个sql.DB
都管理一个连接到底层数据库的活动连接池,根据需要可以在Go程序中创建新的并行的连接。
连接池适用于大多数的数据库访问需求。当你调用sql.DB
的Query
或Exec
方法时,sql.DB
会从池中检索可用的连接,或者在需要时创建一个连接。当不再需要连接时,它会将连接返回到池。这种方式能支持大规模并行访问数据库。
设置连接池属性
你可以设置属性来指导sql
包如何管理连接池。要获取有关这些属性效果的统计信息,请使用DB.Stats
方法。
设置能打开的连接的最大数量
DB.SetMaxOpenConns
方法对打开的连接数量进行了限制。超过此限制,新的数据库操作将等待现有操作完成,然后sql.DB
将创建另一个连接。默认情况下,当需要连接时,sql.DB
会在所有现有连接都在使用时创建一个新连接。
请记住,设置连接数限制会让Go程序连接数据库时使用类似于获取锁或信号量的机制,从而导致程序在等待新的数据库连接时可能会被阻塞等待。
设置空闲连接的最大数量
DB.SetMaxIdleConns
方法更改sql.DB
维护的最大空闲连接数。
当SQL操作在给定的数据库连接上完成时,通常不会立即关闭这个连接:应用程序可能很快再次需要使用该连接,保持打开的连接可以避免在下一次操作时重新连接到数据库。默认情况下,sql.DB
在任何给定时刻保持两个空闲连接。提高最大空闲连接数可以避免在大规模并行程序中频繁重新建立连接。
设置连接可以空闲的最大时间
DB.SetConnMaxIdleTime方法设置连接在关闭之前可以处于空闲状态的最大时间长度。这会导致sql.DB
关闭空闲时间超过给定持续时间的连接。
默认情况下,当一个空闲连接被添加到连接池时,它会一直保持在那里,直到再次需要它为止。使用DB.SetMaxIdleConns
函数来增加并行活动突发期间允许的空闲连接数,也可以使用DB.SetConnMaxIdleTime
函数来安排稍后在系统安静时释放这些连接。
设置连接的最大生存时间
使用DB.SetConnMaxLifetime
函数设置连接在关闭之前可以保持打开的最大时间长度。
默认情况下,连接可以在任意长的时间内使用和重用,但要遵守上述限制。在某些系统中,例如使用负载均衡数据库服务器的系统,确保应用程序在不重新连接的情况下永远不会使用特定连接太长时间,这可能会很有用。
使用专用连接
当某个数据库可能为在一个特殊连接上执行的一系列操作指定隐式含义时,database/sql
包提供可以使用的函数。
最常见的例子是事务,通常以BEGIN
命令开始,以COMMIT
或ROLLBACK
命令结束,并在这个事务的连接上发出所有命令(包括BEGIN
、COMMIT
或ROLLBACK
这几个命令)。对于这个例子,请使用sql包的事务支持。请参阅执行事务。
对于其他必须在同一个连接上执行一系列单独操作的例子,sql包提供了专用连接。DB.Conn
获得一个专用连接sql.Conn
。sql.Conn
有BeginTx
、ExecContext
、PingContext
、PrepareContext
、QueryContext
和QueryRowContext
方法,它们的行为与DB
上的等效方法类似,但只使用专用的连接。专用连接使用完毕后,你的代码必须使用Conn.Close
将其释放。