如何检测数据库断开连接,并使用go-xorm有效地重新连接数据库,例如mysql,tiDB等?

时间:2019-04-30 07:47:06

标签: mysql database go reconnect go-xorm

我需要使用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有更好的方法来处理所有这些问题吗?

0 个答案:

没有答案