如何在数据库中建立循环,直到它连接到mysqlDB

hfyxw5xn  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(100)

我在我的golang程序中有init函数。我需要使它连接循环,直到它连接到数据库,如果它不能连接,它空闲,然后尝试一次又一次,60秒,如果它不能连接,然后它存在了。此外,具有覆盖默认60秒的环境变量,用户可以设置自己的时间,直到连接。我有我的代码下面我看,有没有在网络上的坚实的解决方案。

var override string = os.Getenv("OVERRIDE")

func dsn() string {

    return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ipdb, portdb, dbName)

func init() {

    var db, err = sql.Open("mysql", dsn())
    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Printf("Connection established to MYSQL server\n%s\n", dsn())
    }
    // Checking if table exists in database
    rows, table_check := db.Query("select * from " + "Url" + ";")

    if table_check == nil {
        fmt.Println("\nTable exists in the Database")

        count := 0
        for rows.Next() {
            count++
        }
        fmt.Printf("Number of records are %d \n", count)

    } else {
        fmt.Printf("\nTable does not exist in Database %s", table_check)
        _, status := db.Exec("CREATE TABLE Url (LongUrl varchar(255),ShortUrl varchar(32));")
        if status == nil {
            fmt.Println("\n New table created in the Database")
        } else {
            fmt.Printf("\n The table was not created %s", status)
        }
    }
    defer db.Close()
}
func main(){
......
}
jtoj6r0c

jtoj6r0c1#

您可以使用带计时器通道的开关。
每500ms尝试一次连接,如果在60秒内开关未被解析,则超时通道退出循环。
例如:

func main() {
    doneCh := make(chan bool)
    db, err := sql.Open("mysql", dsn())

    // Start polling for connection
    go func() {
        ticker := time.NewTicker(500 * time.Millisecond)
        timeoutTimer := time.After(time.Second * 60)
        for {
            select {
            case <-timeoutTimer:
                err = errors.New("connection to db timed out")
                doneCh <- true
                return
            case <-ticker.C:
                // Simulate some strange wait ... :)
                if rand.Intn(10) == 2 {
                    err = db.Ping()
                    if err == nil {
                        doneCh <- true
                        return
                    }
                }
                fmt.Println("Retrying connection ... ")
            }
        }
    }()

    // Start waiting for timeout or success
    fmt.Println("Waiting for DB connection ...")
    <-doneCh

    if err != nil {
        fmt.Printf("Could not connect to DB: %v \n", err)
        os.Exit(1)
    }
    defer db.Close()

    // Do some work
    fmt.Printf("Done! Do work now. %+v", db.Stats())
}

注意请视需要行程您的错误。sql.Ping()可能会传回某些特定的错误,提示您应该重试。有些错误可能不值得重试。

有关定时器和通道,请参阅:

相关问题