Мне нужно найти эффективный способ сделать попытку переподключения, используя библиотеку 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?