当前位置: 首页 > article >正文

gozero实现数据库MySQL单例模式连接

在 `GoZero` 框架中实现数据库的单例连接可以通过以下步骤来完成。GoZero 使用 `gorm` 作为默认的数据库操作框架,接下来我会展示一个简单的单例模式实现。

### 1. 定义数据库连接的单例结构

首先,你需要定义一个数据库连接的结构体,并在初始化时保证只有一个连接。```go

package database

import (
    "fmt"
    "log"
    "sync"

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

var (
    db   *gorm.DB
    once sync.Once
)

// InitDB 初始化数据库连接
func InitDB(dsn string) {
    once.Do(func() {
        var err error
        db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            log.Fatalf("failed to connect database: %v", err)
        }
        fmt.Println("Database connected successfully")
    })
}

// GetDB 获取数据库连接
func GetDB() *gorm.DB {
    if db == nil {
        log.Fatal("Database is not initialized")
    }
    return db
}


```

### 2. 说明

- `once.Do`:保证 `InitDB` 函数只会执行一次,即使多次调用也只会初始化数据库连接一次。
- `dsn`:你需要传入数据库连接的 DSN(Data Source Name),通常是类似 `username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local` 这样的格式。
- `GetDB()`:返回数据库的连接,如果数据库未初始化,会触发错误。

### 3. 如何使用

在你的业务代码中,只需要调用 `InitDB` 初始化数据库连接,然后使用 `GetDB` 获取到数据库连接进行操作。```go

package main

import (
    "log"
    "myapp/database"
)

func main() {
    // 初始化数据库连接
    database.InitDB("root:password@tcp(localhost:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local")
    
    // 获取数据库连接
    db := database.GetDB()

    // 执行数据库操作,比如查询数据
    var user User
    if err := db.First(&user).Error; err != nil {
        log.Fatalf("Error querying user: %v", err)
    }

    // 输出查询结果
    log.Printf("User: %+v", user)
}


```

### 4. 完整示例

假设你的 `User` 结构体是如下定义的:```go

package main

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:255"`
}


```

通过这样的方式,你可以保证在应用程序的整个生命周期内,数据库连接仅会被创建一次,从而实现了数据库连接的单例模式。

### 总结

这种方式使用 `sync.Once` 来保证数据库连接在应用中只有一个实例,并提供 `InitDB` 和 `GetDB` 函数来初始化和获取数据库连接。这种方式非常适合于 GoZero 框架的项目,可以有效减少不必要的数据库连接创建。


http://www.kler.cn/a/551277.html

相关文章:

  • Linux探秘坊-------8.进程详解
  • PyTorch入门实战:从零搭建你的第一个神经网络
  • (尚硅谷 Java 学习 B 站大学版)Day17 多态练习
  • 001-监控你的文件-FSWatch-C++开源库108杰
  • 以用户为中心,汽车 HMI 界面设计的创新之道
  • MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
  • 【Pytorch 库】自定义数据集相关的类
  • 基于Unity引擎的网络通信架构深度解析——以NetworkConnectionController为例
  • 聊一聊vue如何实现角色权限的控制的
  • 【16届蓝桥杯寒假刷题营】第2期DAY1I
  • 采用分布式部署deepseek
  • 【白话Spring】三级缓存
  • 【C语言】有序数组的平方
  • 面试真题 | 招银 C++
  • 阿里4面+腾讯4面春招面试题解析,附Java 岗 988 道题分享
  • SQL注入(SQL Injection)详解与实战
  • LVS 负载均衡集群(DR 模式)
  • ThreadLocal为什么会内存溢出
  • 【deepseek之我问】如何把AI技术与教育相结合,适龄教育,九年义务教育,以及大学教育,更着重英语学习。如何结合,给出观点。结合最新智能体Deepseek
  • 【Docker】ollama部署deepseek