- driver包定义了一系列需要由不同驱动实现的接口,供sql包调用
driver中定义的类型和接口
必选接口
- Value的值需要能被具体的数据库驱动实现所处理
- Value的值包括:
- nil
- NamedValueChecker可以处理的类型
- int64
- float64
- bool
- []byte
- string
- time.Time
- 如果数据库驱动实现cursor,返回的Value类型对象需要实现Rows接口
- NamedValue包含了Value类型的值和其名称
|
|
- Driver接口是数据库驱动实现必须实现的接口之一
- 数据库实际上可以实现DriverContext接口来将连接放到连接池中,避免每次操作建立一次连接
- Driver接口的Open方法返回一个新的数据库连接
- Open方法可能返回一个之前关闭的缓存连接,但是sql包中实际上是有连接池来处理空闲连接并提高连接的使用率,因此没太必要
- 返回的Conn连接在同一时间只能被一个线程使用
|
|
- Conn表示一个数据库连接,不能被多个线程同时使用
- Conn是有状态的
- Prepare方法返回一个prepared statement,并和当前的连接绑定
- Close方法会关闭ps语句和事物,释放当前连接
- sql包中对于连接的管理十分完备,因此不推荐驱动自己管理连接缓存,连接的管理交由sql包完成
- Conn接口包含Begin方法来开启一个事物,返回Tx对象
- Stmt接口和一个具体的数据库连接相绑定,不能同时被多个线程使用,preparedStatement
- Close方法完成statement语句的关闭,基本不调用,语句的关闭由sql包管理
- NumInput方法返回stmt语句中的占位符的个数
- Exec方法执行不返回rows数据的数据库操作,比如insert,update操作等,返回Result,目前已经被弃用,driver通过实现StmtExecContext来实现该操作
- Query方法执行返回rows数据的数据库操作,比如select操作,返回Rows,被弃用,通过实现StmtQueryContext来实现该操作
|
|
- 如果数据库实现了DriverContext接口,则sql.DB会通过调用OpenConnector方法获取一个Connector对象,之后调用Connector的Connect方法来获取数据库连接
- 实现DriverContext的好处在于可以解析一次连接名称并可以复用之前创建的连接,效率更高
- OpenConnector解析的数据库连接格式和Driver.Open方法是一致的
- Connector持有固定的连接,可以创建多个等价的数据库连接支持多线程来使用
|
|
- ConnPrepareContext将Conn接口和context结合
|
|
- IsolationLevel表示事务隔离级别,和sql.IsolationLevel相关联
- TxOptions结构体持有事务相关选项,取值参考sql.TxOptions
- ConnBeginTx将Conn和context关联起来
|
|
- SessionResetter来实现一个连接的重置
|
|
- StmtExecContext,StmtQueryContext接口也是与Context相关联起来
|
|
- NamedValueChecker来实现对NamedValue的检查
|
|
- RowsNextResultSet扩展Rows对象,提供了HasNextResultSet和NextResultSet来实现对结果的多种操作
- RowsColumnTypeScanType返回Column的Type类型
- RowsColumnTypeDatabaseTypeName返回Column对应的数据库类型
|
|
可选接口
- Pinger是一个可选接口,一般由Conn来实现
- Pinger由sql.DB来调用,根据其返回值来判定是否连接仍然可用,否则将其移除出连接池
|
|
- ExecerContext由sql.DB.Exec来调用
- 未实现该接口,会调用Execer的Exec方法,如果仍然没有实现,则会调用stmt,exce, close
- QueryerContext 和ExecerContext类似
|
|