Gorm学习(1)| 青训营笔记

62 阅读2分钟

什么是Gorm

gorm是面向golang语言的一种ORM(持久层)框架,支持多种数据库的接入,例如MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于sql语言的掌握程度,使用提供的API进行底层数据库的访问。

Gorm中文文档在 gorm.cn/zh_CN/docs/… 提供从安装到CURD的语句的使用,还有一些比如错误处理、链式操作。

Gorm 的特性

  • 支持事务
  • 支持复合主键、索引、约束
  • API灵活可拓展、多数据库、读写分离
  • 支持使用SQL表达式
  • 关联(Has One、Has Many、Belongs To等等)

数据库连接

这里以mysql为例,需要导入 "gorm.io/driver/mysql" "gorm.io/gorm" 两个库,连接方法如下:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
​

Gorm使用数据库连接池进行连接,主要是为了解决频繁的数据库建立连接等三次握手消耗大量的资源的问题。因此一般都采用连接池对连接进行复用。GORM 使用 database/sql 维护连接池。

sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

数据库连接池

数据库连接池负责分配、管理和释放数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放而引起的连接遗漏。(也就是说连接池都是提前初始化好的连接,避免了频繁的三次握手建立连接耗时)简言之,就是一个池子,里面放着数据库连接,应用服务需要的时候就去池子里面拿,用完之后归还给池子。

连接方式包括同步连接和一步连接,下面有一个示意图,每一个‘s’代表线程,同步连接需要阻塞当前操作的线程,一个线程对应一个连接,因此连接池的数量与线程池的数量一样,图中的方形框可以视为队列,如何确定有什么任务(任务列队),任务是否完成(完成队列)或者哪些连接可用。每一次取用连接池,需要获取连接执行命令后不用了再“释放”连接,实际上就是放回到连接池。

image-20230124114551933.png

异步连接可以避免应用阻塞等待,不需要线程池,而是接入协议来复用主线程,效率有点高,但是不能节省SQL 执行的时间。 这是我参与「第五届青训营 」笔记创作活动的第4天.