Промежуточное завершение службы mariadb при запуске движка

#go

#Вперед

Вопрос:

Мое приложение подключено к Maria Db на другом сервере, поэтому, как только я запускаю свой движок, он извлекает данные путем запроса в базу данных, что я пытаюсь сделать, так это то, что мое приложение запрашивает из базы данных каждые 5 секунд. Я только что завершил работу службы maria DB этим

 service mariadb stop
  

После выполнения этого в моем приложении, где я выполняю запрос, выдается эта ошибка:

 panic: runtime error: invalid memory address or nil pointer dereference
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x54c9a6]

goroutine 50 [running]:
database/sql.(*Rows).close(0x0, 0x0, 0x0, 0x0, 0x0)
    /home/go1.14/go/src/database/sql/sql.go:3063  0x76
database/sql.(*Rows).Close(0x0, 0x0, 0x0)
    /home/go1.14/go/src/database/sql/sql.go:3059  0x33
panic(0x8d03e0, 0xf3dd00)
    /home/go1.14/go/src/runtime/panic.go:969  0x166
database/sql.(*Rows).Next(0x0, 0x1)
    /home/go1.14/go/src/database/sql/sql.go:2744  0x30
path-to-file/loadConfig.LoadFromDB(0x9ff760, 0xc0000240a0, 0xc000192000, 0xf, 0x0, 0x0, 0x0, 0x0)
    path-to-file/loadConfig/loadConfig.go:65  0x1a2
  

Мой код выглядит следующим образом:

 func LoadFromDB(Ctx context.Context, Conn *sql.DB, modId int) (map[string][]string, map[string]string, error) {
    rows, err := Conn.Query(getQueryFromFile("QUERY"),modId)

    if err != nil {
        log.Println("LOAD CONFIG: Error establishing connection to DB")
    }
    defer rows.Close()
    configValues := make(map[string][]string)
    configTimeVal := make(map[string]string)
    for rows.Next() {
        configParam := ""
        configVal := ""
        var configLastUpdated string
        eror := rows.Scan(amp;configParam, amp;configVal, amp;configLastUpdated)
        if eror != nil {
            return nil, nil, eror
        } else {
            configValues[configParam] = append(configValues[configParam], configVal)
            configTimeVal[configParam] = configLastUpdated
        }
    }

        return configValues, configTimeVal, nil
    }
  

Можете ли вы, ребята, помочь мне в том, как справиться с этой ситуацией, когда служба maria db остановлена

Комментарии:

1. Не продолжайте работу с ошибкой из Query и проверяйте rows.Err() каждую итерацию. Смотрите пример в документах

2. хорошо. Понял, спасибо

Ответ №1:

Вы пропускаете return , когда ошибка не равна нулю, поэтому функция просто продолжает работать. Попробуйте это:

     if err != nil {
        log.Println("LOAD CONFIG: Error establishing connection to DB")
        return nil, nil, err
    }
  

Вам также необходимо обрабатывать ошибки из Next() функции; смотрите Документы:

Далее подготавливает следующую строку результатов для чтения с помощью метода сканирования. При успешном завершении возвращает значение true или false, если следующей строки результатов нет или произошла ошибка при ее подготовке. Следует обратиться к Err, чтобы провести различие между этими двумя случаями.

Комментарии:

1. Хорошо, я пропустил это. Спасибо 🙂