theme: github
highlight: a11y-dark
1.0 理解 database/sql
1.1 基本用法 - Quick Start
上面有几行错误
DSN相关知识:
完整:
1.2 设计原理
极简接口设计原则:
对 上层应用 提供标准API接口;对下层暴露简单 驱动接口;内部实现连接池管理
实现不同的数据库驱动就是实现一个额外链接、操作接口。而暴露给应用程序的接口不变,以此实现应用程序使用不同的数据库driver。
连接池使用了池化技术,当遇到请求量大的情况,池化技术就可以提升效率。把昂贵、费时的资源放入特定的池子中,减少创建、销毁、垃圾回收的损耗。
连接池配置 set链接 最大连接数等 或者 取出连接状态;
默认的maxBadConnRetries是默认两次:默认重试两次,
第三行 获取链接conn之后有两种策略:
1、尽量呼应,复用连接池里原来的链接;2、新建连接;
重试的前几次 都尽量复用原来的链接,前面都出错的话 会在最后一次 强制新建连接
获取链接之后 defer操作 把链接放回连接池 有校验操作 满足需求 才放到 连接池 否则直接丢弃
用链接实现driver等操作;
for循环的最后判断error.Is上面的过程中 有没有 任何错误 如果有isBadConn错误 就继续for循环到maxBadConnRetries次数,这个循环过程中 有!isBadConn 就跳出循环;
存在问题maxBadConnRetries不能指定
import顺序不对 也有可能引发初始化异常
缺点:driver的名字可能长而难记,不同人的driver名字不能冲突,后来者使用名字会被提示名字被占用。
新版本的go支持使用结构体:
DB连接的类型:
直接连接/Conn :简单的TCP链接
预编译/Stmt
prepare statement :执行同样sql时,预先prepare 生成prepare statement uid,根据uid执行同样sql时,不用传sql 直接传id 减少传输,解sql时间
事务/Tx :基本知识 不说了
处理返回数据的几种方式(接口)
Exec / ExecContext -> Result:执行sql,获取sql执行的结果是否成功和last insert id;
Query / QueryContext -> Rows (Columns):把数据库请求之后的结果 通过行形式 返回;
QueryRow / QueryRowContext -> Row (Rows 简化) 上面的简化格式 只读取rows的一行 并close;