管理连接
对于绝大多数程序,您无需调整sql.DB
连接池默认值。但是对于一些高级程序,您可能需要调整连接池参数或显式使用连接。本主题说明如何。
sql.DB
数据库句柄对于多个 goroutines 并发使用是安全的(这意味着句柄是其他语言可能称之为“线程安全”的)。其他一些数据库访问库基于一次只能用于一个操作的连接。为了弥合这一差距,每个 sql.DB
管理一个与底层数据库的活动连接池,并根据 Go 程序中的并行性需要创建新连接。
连接池适合大多数数据访问需求。当您调用 sql.DB
Query
或 Exec
方法时,sql.DB
实现会从池中检索可用连接,或者,如果需要,创建一个。当不再需要时,包将连接返回到池。这支持数据库访问的高级并行性。
设置连接池属性
您可以设置指导sql
包如何管理连接池的属性。要获取有关这些属性的影响的统计信息,请使用
DB.Stats
.
设置最大打开连接数
DB.SetMaxOpenConns
对打开的连接数施加限制。超过此限制,新的数据库操作将等待现有操作完成,此时 sql.DB
将创建另一个连接。默认情况下, sql.DB
在需要连接时,只要所有现有连接都在使用中,就会创建一个新连接。
请记住,设置限制会使数据库使用类似于获取锁或信号量,结果是应用程序在等待新的数据库连接时可能会死锁。
设置最大空闲连接数
DB.SetMaxIdleConns
更改sql.DB
保持的最大空闲连接数限制。
当 一个SQL 操作在给定的数据库连接上完成时,它通常不会立即关闭:应用程序可能很快会再次需要一个,并且保持打开的连接可以避免必须重新连接到数据库以进行下一个操作。默认情况下,一个sql.DB
在任何给定时刻保持两个空闲连接。提高限制可以避免在具有显著并行性的程序中频繁重新连接。
设置连接可以空闲的最大时间量
DB.SetConnMaxIdleTime
设置连接在关闭之前可以空闲的最长时间。这会导致sql.DB
关闭空闲时间超过给定持续时间的连接。
默认情况下,当空闲连接添加到连接池时,它会一直保留在那里,直到再次需要它为止。当 DB.SetMaxIdleConns
用于在并行活动突发期间增加允许的空闲连接数时,也可以用 DB.SetConnMaxIdleTime
可以安排在系统安静时释放这些连接。
设置连接的最长生命周期
使用DB.SetConnMaxLifetime
设置连接在关闭之前可以保持打开的最长时间
默认情况下,可以在任意长的时间内使用和重用连接,但要遵守上述限制。在某些系统中,例如使用负载均衡数据库服务器的系统,确保应用程序在不重新连接的情况下永远不会使用特定连接太长时间会很有帮助。
使用专用连接
database/sql
包包含当数据库可能为在特定连接上执行的一系列操作分配隐式含义时可以使用的函数。
最常见的例子是事务,它通常以 BEGIN
命令开头 ,以COMMIT
或 ROLLBACK
命令结尾,并包括在整个事务中这些命令之间的连接上发出的所有命令。对于这个用例,使用 sql
包的事务支持。请参阅执行事务。
对于必须在同一连接上执行一系列单独操作的其他用例,sql
包提供专用连接。DB.Conn
获得一个专用连接,一个 sql.Conn
. sql.Conn
具有 BeginTx
, ExecContext
, PingContext
,
PrepareContext
, QueryContext
, 和 QueryRowContext
等方法,其行为类似于 DB 上的等效方法,但只使用专用连接。完成专用连接后,您的代码必须使用 Conn.Close
释放它。