Golang databasesql源码分析

Python024

Golang databasesql源码分析,第1张

Gorm是Go语言开发用的比较多的一个ORM。它的功能比较全:

但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析。原因是Gorm也是基于这个包来封装的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源码。

database/sql 其实也是一个对于mysql驱动的上层封装。”github.com/go-sql-driver/mysql”就是一个对于mysql的驱动,database/sql 就是在这个基础上做的基本封装包含连接池的使用

下面这个是最基本的增删改查操作

操作分下面几个步骤:

因为Gorm的连接池就是使用database/sql包中的连接池,所以这里我们需要学习一下包里的连接池的源码实现。其实所有连接池最重要的就是连接池对象、获取函数、释放函数下面来看一下database/sql中的连接池。

DB对象

获取方法

释放连接方法

连接池的实现有很多方法,在database/sql包中使用的是chan阻塞 使用map记录等待列表,等到有连接释放的时候再把连接传入等待列表中的chan 不在阻塞返回连接。

之前我们看到的Redigo是使用一个chan 来阻塞,然后释放的时候放入空闲列表,在往这一个chan中传入struct{}{},让程序继续 获取的时候再从空闲列表中获取。并且使用的是链表的结构来存储空闲列表。

database/sql 是对于mysql驱动的封装,然而Gorm则是对于database/sql的再次封装。让我们可以更加简单的实现对于mysql数据库的操作。

1.最简单的方法:

public static String reverse1(String str)

{ return new StringBuffer(str).reverse().toString()

}

2.最常用的方法:

public static String reverse3(String s)

{char[] array = s.toCharArray()

String reverse = "" //注意这是空串,不是null

for (int i = array.length - 1i >= 0i--)

reverse += array[i]

return reverse

}

3.常用方法的变形:

public static String reverse2(String s)

{ int length = s.length()

String reverse = "" //注意这是空串,不是null

for (int i = 0i <lengthi++)

reverse = s.charAt(i) + reverse//在字符串前面连接, 而非常见的后面

return reverse

}

k6是新兴的性能测试框架,比肩jmeter,另外测试脚本使用js,更加适合自动化的架构。

k6启动的框架是使用golang的cli标准框架cobra,入口函数

进入cobra框架后,我们直接查看getRunCmd,这个是命令run的入口,主要工作都是从这里开始。

重点关注初始化Runner,这个是通过js脚本,使用goja库解析后,生成的实际执行单元。

进入js目录,查看Runner的结构,runner.go

Runner有一些配置属性,另外还有方法,方法用lib.Runner的接口进行规范。

Runner有一个NewVU方法,里面定义了连接参数,实现api测试

返回主函数,在初始化完成Runner后,启动调度器,以及做结果收集

最终封装成一个engine

启动测试