Как обнаружить отключение базы данных и эффективно восстановить соединение, используя go-xorm для таких баз данных, как mysql, tiDB и т. Д.? - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно найти эффективный способ сделать попытку переподключения, используя библиотеку go-xorm. В настоящее время, если происходит разъединение, соединение теряется, и дальнейшие запросы не выполняются, даже если через некоторое время база данных возвращается в оперативный режим.

Создает ли xorm событие при отключении ?? Если так, как я могу слушать это событие.

Моя идея состояла в том, чтобы прослушивать разъединение даже в обычной процедуре, по каналу ... и запускать логику переподключения (закрыть текущий сеанс и текущий механизм и воссоздать новый механизм и сеанс поверх него.)

Если xorm не генерирует событие отключения, мне нужно будет периодически проверять базу данных на наличие ошибок ... которых я хочу избежать.

В настоящее время я устанавливаю соединение следующим образом: -

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 в отдельной подпрограмме до появления ошибки, а затем закрываю текущий сеанс и механизм и создаю новые.

Можно ли сделать это лучше, сделав его основанным на событиях?

Должен ли я каждый раз создавать новый движок и сеанс?

Или есть лучший способ справиться со всем этим, используя go-xorm?

...