亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gorm多數據庫連接管理

gorm多數據庫連接管理

Go
ABOUTYOU 2022-07-11 16:07:55
我有一個要求,我的應用程序與不同的數據庫通信。我如何管理 gorm 中的連接。gorm 有什么方法支持多個數據庫的連接管理?;蛘呶倚枰獎摻ò袛祿爝B接的地圖。if val, ok := selector.issure_db[issuer]; ok {    return val , nil;} else {    var dbo  *db.DB;    selector.mu.Lock()    dbo, err := db.NewDb(Config)    if err != nil {        boot.Logger(ctx).Fatal(err.Error())    }    selector.issure_db[issuer] = dbo;    selector.mu.Unlock()    return repo ,nil;}有沒有更好的方法來做到這一點?
查看完整描述

2 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

您可以為 GORM 使用dbresolver插件。它管理多個源和副本,并為組維護一個底層連接池。您甚至可以使用配置將應用程序中的模型映射到正確的數據庫。


文檔中的示例:


import (

  "gorm.io/gorm"

  "gorm.io/plugin/dbresolver"

  "gorm.io/driver/mysql"

)


db, err := gorm.Open(mysql.Open("db1_dsn"), &gorm.Config{})


db.Use(dbresolver.Register(dbresolver.Config{

  // use `db2` as sources, `db3`, `db4` as replicas

  Sources:  []gorm.Dialector{mysql.Open("db2_dsn")},

  Replicas: []gorm.Dialector{mysql.Open("db3_dsn"), mysql.Open("db4_dsn")},

  // sources/replicas load balancing policy

  Policy: dbresolver.RandomPolicy{},

}).Register(dbresolver.Config{

  // use `db1` as sources (DB's default connection), `db5` as replicas for `User`, `Address`

  Replicas: []gorm.Dialector{mysql.Open("db5_dsn")},

}, &User{}, &Address{}).Register(dbresolver.Config{

  // use `db6`, `db7` as sources, `db8` as replicas for `orders`, `Product`

  Sources:  []gorm.Dialector{mysql.Open("db6_dsn"), mysql.Open("db7_dsn")},

  Replicas: []gorm.Dialector{mysql.Open("db8_dsn")},

}, "orders", &Product{}, "secondary"))


查看完整回答
反對 回復 2022-07-11
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

您可以創建一個名為 database 的包并在 init.go 文件中編寫一個 init 函數,該函數可以為您擁有的每個數據庫創建一個 DB 對象來連接數據庫。您可以在應用程序中的任何地方使用此 db 對象,這也將啟用連接池。


初始化.go


var db *gorm.DB


func init() {

    var err error

    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)

    db, err = gorm.Open("mysql", dataSourceName)

    db.DB().SetConnMaxLifetime(10 * time.Second)

    db.DB().SetMaxIdleConns(10)


    //initialise other db objects here

}


用戶.go


func getFirstUser() (user User) {

    db.First(&user)

    return

}

PS> 如果您必須連接到 1 或 2 個數據庫,此解決方案會很有效。如果您需要同時連接到多個數據庫,您應該使用 dbresolver 插件。


舊答案


您可以編寫一個單獨的函數,每次調用該函數時返回當前數據庫連接對象。


func getDBConnection(dbUser, dbPassword, dbHost, dbName string) (db *gorm.DB, err error) {

    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)

    db, err = gorm.Open("mysql", dataSourceName)

    db.DB().SetConnMaxLifetime(10 * time.Second)

    return

}

并且每次調用 getDBConnection 函數后調用 defer db.Close() 。


func getFirstUser() (user User) {

    db, _ := getDBConnection()

    defer db.Close()

    db.First(&user)

    return

}

這樣,每次執行查詢后,您的連接都會關閉。


查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 370 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號