英文:
How to handle postgres DB connection timeout/drop in gorm
问题
我的DB连接及其getter如下所示:
func connectDB() (*gorm.DB, error) {
db, err := gorm.Open(postgres.Open(dbURL), &gorm.Config{})
if err != nil {
return nil, err
}
return db, nil
}
func GetDB() (*gorm.DB, error) {
if db == nil {
return connectDB()
} else {
return db, nil
}
}
我在我的代码中使用GetDB()
来对数据库进行操作。我的应用程序运行大约15分钟。如何确保连接db *gorm.DB
在这段时间内不会超时?即使在15分钟内没有超时,如果连接由于网络错误等原因断开,如何优雅地重新连接?
英文:
My DB connection and its getter is as follow:
func connectDB() (*gorm.DB, error) {
db, err := gorm.Open(postgres.Open(dbURL), &gorm.Config{})
if err != nil {
return nil, err
}
return db, nil
}
func GetDB() (*gorm.DB, error) {
if db == nil {
return connectDB()
} else {
return db, nil
}
}
I use GetDB()
in my code to do operations on the database. My app runs for about 15 minutes. How can I make sure the connection db *gorm.DB
will not timeout during all that time? Even if it does not timeout within 15 minutes, how to reconnect gracefully if the connection happens to drop due to network error, etc?
答案1
得分: 2
GORM使用database/sql来维护连接池。连接池可以处理连接超时和错误。连接池可以按以下方式进行配置:
sqlDB, err := db.DB()
// SetMaxIdleConns设置空闲连接池中的最大连接数。
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns设置与数据库的最大打开连接数。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime设置连接可重用的最长时间。
sqlDB.SetConnMaxLifetime(time.Hour)
英文:
GORM using database/sql to maintain connection pool. The connection pool could handle the connection timeout and error. The connection pool could be configured as below
sqlDB, err := db.DB()
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)
答案2
得分: 0
我建议你使用通用数据库接口*sql.DB的ping()函数。链接
Ping函数用于验证与数据库的连接是否仍然有效,如果需要,会建立一个新的连接。
因此,每当你向数据库发送新的请求时(或者只针对你知道会在长时间之后执行的请求),你可以首先对数据库进行ping操作,确保它仍然处于活动状态(否则ping操作会自动重新连接到数据库),然后再执行你的请求。
英文:
I suggest you to use a generic database interface *sql.DB ping() function https://gorm.io/docs/generic_interface.html
> Ping verifies a connection to the database is still alive, establishing a connection if necessary.
So whenever you do a new request to your database (or just for the requests you know would be executed after a long period of time) you can ping the db first and make sure it is still active (in other case the ping reconnects to the db automatically), and then do your request.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论