管理连接
对于绝大多数程序,您无需调整 sql.DB
连接池的默认设置。但对于某些高级程序,您可能需要调整连接池参数或显式地操作连接。本主题将解释如何进行。
sql.DB
数据库句柄对于多个 goroutine 并发使用是安全的(这意味着该句柄在其他语言中可能被称为“线程安全”)。其他一些数据库访问库基于只能一次执行一个操作的连接。为了弥补这个差距,每个 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
释放它。