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"))

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
}
這樣,每次執行查詢后,您的連接都會關閉。
- 2 回答
- 0 關注
- 370 瀏覽
添加回答
舉報