我需要找到一种有效的方法来尝试重新连接,使用 go-xorm 库。目前,如果发生断开连接,连接将丢失并且进一步的查询失败,即使数据库在一段时间后恢复在线。
xorm 是否会在断开连接时生成事件?如果是这样,我该如何收听此事件。
我的想法是即使在 goroutine 中也通过通道监听断开连接.. 并触发重新连接逻辑(关闭当前会话和当前引擎并在其之上重新创建一个新引擎和一个会话。)
如果 xorm 没有生成断开连接事件,我将不得不每隔一段时间对数据库执行 ping 操作以检查是否存在我想避免的错误。
目前我正在通过以下方式建立连接:-
func (sql *SQL) Connect() error {
var err error
sql.engine, err = xorm.NewEngine(sql.config.Sql.Engine, sql.config.Sql.Url)
// sql.engine.SetMaxOpenConns(1)
// sql.engine.SetMaxIdleConns(1)
// Use a single connect across this instance apart for transactions
sql.session = sql.engine.NewSession()
go monitorConnection(sql, sql.config.Sql.Engine, sql.config.Sql.Url)
return err
}
func refresh(sql *SQL, engine string, url string) (err error) {
sql.session.Close()
sql.engine.Close()
sql.engine = nil
sql.session = nil
sql.engine, err = xorm.NewEngine(engine, url)
sql.session = sql.engine.NewSession()
return err
}
func monitorConnection(sql *SQL, engine string, url string) {
var err error
for {
err = sql.engine.Ping()
if err != nil {
refresh(sql, engine, url)
}
time.Sleep(time.Duration(1000) * time.Millisecond)
}
}
配置通过其他功能填充。
所以目前我觉得我可以实现重新连接的唯一方法是在一个单独的例程中不断地 ping 数据库,直到发生错误,然后关闭当前会话和引擎并创建新的。
这可以以更好的方式完成,使其基于事件吗?
我每次都必须创建一个新引擎和会话吗?
或者有没有更好的方法来处理所有这些,使用 go-xorm ?