连接池和配置

GORM 底层使用 Go 标准库 database/sql 管理连接池。

项目里不要每次请求都重新连接数据库,应该在程序启动时创建一次 *gorm.DB,后续复用。

一、连接池配置

sqlDB, err := db.DB()
if err != nil {
    return err
}

sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)

需要导入:

import "time"

含义:

配置说明
SetMaxIdleConns最大空闲连接数
SetMaxOpenConns最大打开连接数
SetConnMaxLifetime单个连接最长复用时间

二、完整初始化函数

package database

import (
    "time"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func New(dsn string) (*gorm.DB, error) {
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        return nil, err
    }

    sqlDB, err := db.DB()
    if err != nil {
        return nil, err
    }

    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetConnMaxLifetime(time.Hour)

    return db, nil
}

调用:

db, err := database.New(os.Getenv("MYSQL_DSN"))
if err != nil {
    panic(err)
}

三、配置不要写死

不要把账号密码写死:

dsn := "root:123456@tcp(127.0.0.1:3306)/gorm_tutorial?charset=utf8mb4&parseTime=True&loc=Local"

推荐用环境变量:

dsn := os.Getenv("MYSQL_DSN")

.env.example 可以写示例:

MYSQL_DSN=root:123456@tcp(127.0.0.1:3306)/gorm_tutorial?charset=utf8mb4&parseTime=True&loc=Local

真实 .env 不要提交到 Git。

四、开启开发日志

最简单方式:

db = db.Debug()

它会打印执行 SQL,适合学习和本地调试。

不要在生产环境长期开启大量 SQL 日志,可能影响性能,也可能泄漏敏感数据。

五、初始化时自动迁移

本地练习时可以在启动时执行:

err := db.AutoMigrate(&model.User{}, &model.Article{}, &model.Comment{})
if err != nil {
    panic(err)
}

真实生产环境建议谨慎:

  • 本地开发可以自动迁移。
  • 生产环境核心库建议用明确的迁移脚本。
  • 迁移前要备份。

六、关闭连接

程序退出时可以关闭底层连接:

sqlDB, err := db.DB()
if err != nil {
    return err
}

return sqlDB.Close()

Web 服务通常在进程生命周期内复用连接池,退出时统一关闭。

七、常见目录

project/
├── cmd/
│   └── server/
│       └── main.go
├── internal/
│   ├── database/
│   │   └── mysql.go
│   ├── model/
│   │   ├── user.go
│   │   └── article.go
│   └── repository/
│       └── user_repository.go
└── go.mod

目录职责:

目录作用
database初始化数据库连接
model定义 GORM 模型
repository封装数据库操作
cmd/server程序入口