GoZero實(shí)現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡(jiǎn)單示例
1. 定義數(shù)據(jù)庫連接的單例結(jié)構(gòu)
首先,你需要定義一個(gè)數(shù)據(jù)庫連接的結(jié)構(gòu)體,并在初始化時(shí)保證只有一個(gè)連接。
package database
import (
"fmt"
"log"
"sync"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
db *gorm.DB
once sync.Once
)
// InitDB 初始化數(shù)據(jù)庫連接
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 獲取數(shù)據(jù)庫連接
func GetDB() *gorm.DB {
if db == nil {
log.Fatal("Database is not initialized")
}
return db
}
2. 說明
once.Do:保證InitDB函數(shù)只會(huì)執(zhí)行一次,即使多次調(diào)用也只會(huì)初始化數(shù)據(jù)庫連接一次。dsn:你需要傳入數(shù)據(jù)庫連接的 DSN(Data Source Name),通常是類似username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local這樣的格式。GetDB():返回?cái)?shù)據(jù)庫的連接,如果數(shù)據(jù)庫未初始化,會(huì)觸發(fā)錯(cuò)誤。
3. 如何使用
在你的業(yè)務(wù)代碼中,只需要調(diào)用 InitDB 初始化數(shù)據(jù)庫連接,然后使用 GetDB 獲取到數(shù)據(jù)庫連接進(jìn)行操作。
package main
import (
"log"
"myapp/database"
)
func main() {
// 初始化數(shù)據(jù)庫連接
database.InitDB("root:password@tcp(localhost:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local")
// 獲取數(shù)據(jù)庫連接
db := database.GetDB()
// 執(zhí)行數(shù)據(jù)庫操作,比如查詢數(shù)據(jù)
var user User
if err := db.First(&user).Error; err != nil {
log.Fatalf("Error querying user: %v", err)
}
// 輸出查詢結(jié)果
log.Printf("User: %+v", user)
}
4. 完整示例
假設(shè)你的 User 結(jié)構(gòu)體是如下定義的:
package main
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:255"`
}
通過這樣的方式,你可以保證在應(yīng)用程序的整個(gè)生命周期內(nèi),數(shù)據(jù)庫連接僅會(huì)被創(chuàng)建一次,從而實(shí)現(xiàn)了數(shù)據(jù)庫連接的單例模式。
總結(jié)
這種方式使用 sync.Once 來保證數(shù)據(jù)庫連接在應(yīng)用中只有一個(gè)實(shí)例,并提供 InitDB 和 GetDB 函數(shù)來初始化和獲取數(shù)據(jù)庫連接。這種方式非常適合于 GoZero 框架的項(xiàng)目,可以有效減少不必要的數(shù)據(jù)庫連接創(chuàng)建。
到此這篇關(guān)于GoZero實(shí)現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡(jiǎn)單示例的文章就介紹到這了,更多相關(guān)GoZero MySQL單例模式連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解
這篇文章主要介紹了Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個(gè)完整的請(qǐng)求包含請(qǐng)求和處理請(qǐng)求以及結(jié)果返回三個(gè)步驟,在服務(wù)器端對(duì)請(qǐng)求處理完成以后,會(huì)將結(jié)果返回給客戶端,在gin框架中,支持返回多種請(qǐng)求數(shù)據(jù)格式,下面我們一起來看看2023-05-05

