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