connProvider func(ctx context.Context) (*sql.DB, error)
这是一个函数类型字段,存了一个 “能拿到数据库连接池 *sql.DB” 的函数。其中*sql.DB 是 Go 标准库 database/sql 的数据库连接池管理器,内部维护一堆真实 TCP 连接。
为什么调用这个connProvider函数,就能拿到 *sql.DB 对象?
core/stores/sqlx/sqlmanager.go
func newDBConnection(driverName, datasource string) (*sql.DB, error) {
conn, err := sql.Open(driverName, datasource)
if err != nil {
return nil, err
}
........
if err := conn.Ping(); err != nil {
_ = conn.Close()
return nil, err
}
return conn, nil
}
创建并初始化一个标准库 *sql.DB 连接池,然后用conn.Ping()测试数据连接有效性(踩坑经验堆出来的!),因为sql.Open 只管创建内存对象,不建真实连接。