我需要使用go-xorm库找到一种尝试重新连接的有效方法。当前,即使发生断开连接,连接也会丢失,并且即使数据库在一段时间后恢复联机,其他查询也会失败。
xorm是否在断开连接时生成事件?如果是这样,我该如何收听此事件。
我的想法是,即使在go例程中,也要通过通道来监听断开连接并触发重新连接逻辑(关闭当前会话和当前Engine,并在其之上重新创建一个新引擎和一个会话。)>
如果xorm没有生成断开连接事件,则我将不得不间隔ping一次db来检查错误。
目前,我正在按照以下方式进行连接:-
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)
}
}
通过其他功能填充了配置。
因此,目前我能实现重新连接的唯一方法是在一个单独的例程中对db进行ping操作,直到出现错误为止,然后关闭当前会话和引擎并创建新会话。
可以通过一种更好的方式来做到这一点,使其基于事件吗?
我是否每次都要创建一个新引擎和会话?
或者使用go-xorm有更好的方法来处理所有这些问题吗?