Golang: Ping преуспевает во второй раз, даже если база данных не работает

я столкнулся с интересной проблемой, а именно, с этой db.Пинг() не возвращает ошибку, даже если база данных была убита с первой попытки.

исходный код ниже:

import (
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

type database struct {
    datasource string
    conn       *sql.DB
}

// Connect creates and initialises a Database struct
func (db *database) Connect(server, user, password, DBPort string) error {
    var err error

    db.datasource = fmt.Sprintf("%s:%[email protected]/", user, password)
    db.conn, err = sql.Open(server, db.datasource)
    if err != nil {
        log.Fatal(err)
    }

    err = db.conn.Ping()
    if err != nil {
        db.conn.Close()
        return err
    }

    log.Println("Waiting for 15 seconds, kill the DB")
    <-time.After(15 * time.Second)

    err = db.conn.Ping()
    if err != nil {
        db.conn.Close()
        return err
    }

    log.Println("Second ping successful")

    return nil
}

во-первых, база данных, так что первый пинг проходит успешно. Тем не менее, я поставил задержку там только ради тестирования. В эти 15 секунд я останавливаю базу данных (sudo service mysql stop), однако, db.Ping () все еще преуспевает.

если я выполнить запрос (через db.Query, db.QueryRow или db.Exec), то пакет sql будет паниковать со сломанной трубой (что ожидается).

я делаю что-то не так?

также: go версия go1.7.1 linux / amd64

спасибо заранее!

1 ответов


Ping, после первого соединения, на самом деле не ping базы данных. Это странно и неправильно, но так это работает (пока Go 1.8). Если в пуле соединений есть существующее соединение, которое не истекло, Ping просто удалит его из пула и вернет вам, не потрудившись проверить, существует ли база данных.

Kardianos (который написал вышеупомянутый связанный документ, а также Govendor) исправил это в 1.8, драйвер база данных поддерживает его. Однако до тех пор Ping не является надежным для определения того, существует ли база данных.