一、database/sql
包对数据库的连接
- 提供了
sql.Open
函数用于打开数据库连接。 - 通过
sql.DB
类型管理连接池,支持高效地处理并发请求。
- 连接池管理:
sql.DB
维护一组活跃的数据库连接,这些连接可以被多个goroutine共享。- 当需要执行数据库操作时,
sql.DB
会从连接池中分配一个可用连接,操作完成后将连接返回到池中。
- 并发安全:
sql.DB
是并发安全的,多个goroutine可以同时使用它来执行数据库操作。
- 连接复用:
- 连接池中的连接可以被复用,避免了频繁创建和销毁连接的开销。
- 连接限制:
- 通过配置
SetMaxOpenConns
和SetMaxIdleConns
,可以控制连接池的大小和空闲连接的数量。
- 通过配置
二、sql.DB
的连接池机制
1. 连接池的工作流程
-
获取连接: 当调用
db.Query
、db.Exec
等方法时,sql.DB
会从连接池中获取一个可用连接。如果池中没有可用连接且未达到最大连接数限制,则会创建一个新连接。 -
释放连接: 当数据库操作完成后,连接会被返回到连接池中,供后续操作复用。
-
空闲连接管理: 如果连接池中有空闲连接,它们会保持打开状态,直到超过最大空闲时间(通过
SetConnMaxIdleTime
设置)或达到最大空闲连接数(通过SetMaxIdleConns
设置)。
2. 连接池的配置
-
SetMaxOpenConns
: 设置连接池中最大打开的连接数。默认值为0
,表示无限制。db.SetMaxOpenConns(10)
-
SetMaxIdleConns
: 设置连接池中最大空闲连接数。默认值为2
。db.SetMaxIdleConns(5)
-
SetConnMaxLifetime
: 设置连接的最大存活时间。超过该时间的连接会被关闭并重新创建。默认值为0
,表示无限制。db.SetConnMaxLifetime(time.Hour)
-
SetConnMaxIdleTime
: 设置连接的最大空闲时间。超过该时间的空闲连接会被关闭。默认值为0
,表示无限制。db.SetConnMaxIdleTime(30 * time.Minute)