DATABASE/SQL 与 GORM 设计与实践 01| 青训营

63 阅读2分钟
theme: github
highlight: a11y-dark

1.0 理解 database/sql

1.1 基本用法 - Quick Start

image-20230525223147443

上面有几行错误

DSN相关知识:

github.com/go-sql-driv…

en.wikipedia.org/wiki/Data_s…

image-20230525223720980

image-20230525223804954

image-20230525224345524

image-20230525224425725

完整:

image-20230525224557669

1.2 设计原理

image-20230525224625936

极简接口设计原则:

对 上层应用 提供标准API接口;对下层暴露简单 驱动接口;内部实现连接池管理

实现不同的数据库驱动就是实现一个额外链接、操作接口。而暴露给应用程序的接口不变,以此实现应用程序使用不同的数据库driver。

连接池使用了池化技术,当遇到请求量大的情况,池化技术就可以提升效率。把昂贵、费时的资源放入特定的池子中,减少创建、销毁、垃圾回收的损耗。

image-20230525225306171

连接池配置 set链接 最大连接数等 或者 取出连接状态;

image-20230526110428362

默认的maxBadConnRetries是默认两次:默认重试两次,

第三行 获取链接conn之后有两种策略:

1、尽量呼应,复用连接池里原来的链接;2、新建连接;

重试的前几次 都尽量复用原来的链接,前面都出错的话 会在最后一次 强制新建连接

获取链接之后 defer操作 把链接放回连接池 有校验操作 满足需求 才放到 连接池 否则直接丢弃

用链接实现driver等操作;

for循环的最后判断error.Is上面的过程中 有没有 任何错误 如果有isBadConn错误 就继续for循环到maxBadConnRetries次数,这个循环过程中 有!isBadConn 就跳出循环;

image-20230526110337584

存在问题maxBadConnRetries不能指定

image-20230526110732865

import顺序不对 也有可能引发初始化异常

image-20230526110814793

缺点:driver的名字可能长而难记,不同人的driver名字不能冲突,后来者使用名字会被提示名字被占用。

新版本的go支持使用结构体:

image-20230526111323236

image-20230526111639940

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;

image-20230526185549342

image.png