Rumah  >  Artikel  >  pangkalan data  >  Cara menyambung ke pangkalan data MySQL yang diedarkan menggunakan bahasa Go

Cara menyambung ke pangkalan data MySQL yang diedarkan menggunakan bahasa Go

WBOY
WBOYasal
2023-06-18 10:48:361328semak imbas

Dalam sistem teragih, pangkalan data memainkan peranan yang sangat kritikal. Untuk sistem teragih yang besar, kami selalunya perlu menggunakan berbilang pangkalan data untuk pemprosesan terlunas bagi memenuhi keperluan aplikasi. Sebagai pangkalan data hubungan yang digunakan secara meluas, MySQL boleh menyambung dan mengurus berbilang kejadian melalui bahasa Go untuk membina sistem teragih yang sangat tersedia, berprestasi tinggi.

Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk menyambung ke pangkalan data MySQL yang diedarkan, yang dibahagikan kepada bahagian berikut:

1 Pasang bahasa Go
2
3. Sambung ke pangkalan data MySQL
4. Gunakan kumpulan sambungan untuk menguruskan berbilang kejadian
5. Pertama, kita perlu memasang persekitaran bahasa Go. Kami boleh memuat turun pakej pemasangan bahasa Go daripada tapak web rasmi Go: https://golang.org/dl/. Pilih versi yang sesuai untuk sistem pengendalian anda, muat turun dan pasangnya.

  1. Pasang pemacu MySQL

Anda perlu menggunakan pemacu Go MySQL untuk menyambung ke pangkalan data MySQL. Kami boleh menggunakan pemacu MySQL rasmi atau pemacu pihak ketiga. Di sini kami mengambil pemacu rasmi sebagai contoh Pemacu MySQL rasmi ialah: github.com/go-sql-driver/mysql

    Kami boleh menggunakan arahan go get untuk mendapatkan dan memasang pemacu MySQL. Jalankan arahan berikut dalam terminal:
  1. go get -u github.com/go-sql-driver/mysql
Sambung ke pangkalan data MySQL

Untuk menyambung ke pangkalan data MySQL, anda perlu menentukan alamat IP, nombor port, nama pengguna dan kata laluan contoh pangkalan data. Dalam Go, kita boleh menyambung ke pangkalan data MySQL melalui API yang disediakan oleh pakej pangkalan data/sql. Berikut ialah contoh program untuk menyambung ke pangkalan data MySQL:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    //连接MySQL数据库
    db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    //查询MySQL数据库中的数据
    rows, err := db.Query("SELECT * from user")
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()

    //遍历查询结果
    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            panic(err.Error())
        }
        fmt.Printf("id: %d, name: %s
", id, name)
    }
}
    Dalam contoh program di atas, kami mula-mula menggunakan fungsi sql.Open() untuk menyambung ke pangkalan data MySQL. Parameter "mysql" bermaksud menggunakan pangkalan data MySQL; "root:123456" ialah nama pengguna dan kata laluan "127.0.0.1:3306" ialah alamat pangkalan data dan nombor port;
  1. Kemudian, kami menggunakan fungsi db.Query() untuk menanyakan data dalam pangkalan data MySQL. Hasil pertanyaan ialah objek Rows. Akhir sekali, kami menggunakan fungsi rows.Next() untuk merentasi keputusan pertanyaan, mendapatkan data dan mengeluarkannya.

Gunakan kumpulan sambungan untuk mengurus berbilang kejadian

Apabila menggunakan pangkalan data MySQL dalam sistem yang diedarkan, kita biasanya perlu menggunakan berbilang kejadian pangkalan data dan menggunakan kumpulan sambungan untuk mengurusnya. contoh. Dalam bahasa Go, kita boleh menggunakan objek sql.DB yang disediakan oleh pakej pangkalan data/sql untuk melaksanakan pengumpulan sambungan. Berikut ialah contoh program yang menggunakan pengumpulan sambungan untuk mengurus berbilang kejadian pangkalan data MySQL:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "sync"
)

var dbMap = sync.Map{}

func getDBInstance(addr string) (*sql.DB, error) {
    var (
        db  *sql.DB
        err error
    )
    //从连接池中获取数据库实例
    if val, ok := dbMap.Load(addr); ok {
        db = val.(*sql.DB)
        return db, nil
    }

    //创建新的数据库实例
    db, err = sql.Open("mysql", "root:123456@"+addr+"/test")
    if err != nil {
        return nil, err
    }

    //将新的数据库实例加入连接池中
    dbMap.Store(addr, db)
    return db, nil
}

//查询数据库中数据
func query(addr string) {
    db, err := getDBInstance(addr)
    if err != nil {
        panic(err)
    }
    rows, err := db.Query("SELECT * from user")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            panic(err)
        }
        fmt.Printf("id:%d name:%s
", id, name)
    }
}

func main() {
    addrList := []string{"127.0.0.1:3306", "127.0.0.1:3307"}
    for _, addr := range addrList {
        go query(addr)
    }
    select {}
}
    Dalam contoh program di atas, kami menggunakan objek penyegerakan.Peta dbMap untuk menyimpan semua kejadian pangkalan data dalam kumpulan sambungan.
  1. Apabila menanyakan data, kami mula-mula menggunakan fungsi getDBInstance() untuk mendapatkan contoh pangkalan data daripada kumpulan sambungan. Jika tidak ditemui, gunakan fungsi sql.Open() untuk mencipta tika pangkalan data baharu, dan kemudian tambahkan tika ini pada kumpulan sambungan.

Kemudian, kami menggunakan fungsi db.Query() untuk menanyakan data daripada pangkalan data. Akhir sekali, kami menggunakan fungsi rows.Scan() untuk merentasi keputusan pertanyaan, mendapatkan data dan mengeluarkannya.

Menggunakan transaksi teragih

Apabila menggunakan berbilang pangkalan data MySQL dalam sistem teragih yang besar, kami mungkin perlu melakukan operasi transaksi pada sumber data yang berbeza. Dalam bahasa Go, kita boleh menggunakan objek Tx yang disediakan oleh pangkalan data/pakej sql untuk mengurus transaksi yang diedarkan. Berikut ialah contoh program menggunakan transaksi teragih:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "sync"
)

var dbMap = sync.Map{}

func getDBInstance(addr string) (*sql.DB, error) {
    var (
        db  *sql.DB
        err error
    )
    if val, ok := dbMap.Load(addr); ok {
        db = val.(*sql.DB)
        return db, nil
    }

    db, err = sql.Open("mysql", "root:123456@"+addr+"/test")
    if err != nil {
        return nil, err
    }

    dbMap.Store(addr, db)
    return db, nil
}

func transfer(fromDB, toDB string, amount int) error {
    tx, err := getDBInstance(fromDB).Begin() //开始事务
    if err != nil {
        return err
    }
    defer tx.Rollback() //回滚事务

    //从fromDB转移amount到toDB
    _, err = tx.Exec("UPDATE account SET balance=balance-? WHERE id=1", amount)
    if err != nil {
        return err
    }
    _, err = getDBInstance(toDB).Exec("UPDATE account SET balance=balance+? WHERE id=2", amount)
    if err != nil {
        return err
    }

    err = tx.Commit() //提交事务
    if err != nil {
        tx.Rollback()
        return err
    }
    return nil
}

func main() {
    err := transfer("127.0.0.1:3306", "127.0.0.1:3307", 100)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("transfer success")
    }
}
    Dalam contoh program di atas, kami menggunakan fungsi getDBInstance() untuk mendapatkan contoh pangkalan data daripada kumpulan sambungan. Kemudian, dalam fungsi pemindahan(), kami menggunakan fungsi tx.Begin() untuk mencipta transaksi baharu, dan kemudian menggunakan fungsi tx.Exec() untuk melaksanakan penyata SQL dalam fromDB dan toDB untuk melengkapkan operasi pemindahan.
  1. Akhir sekali, gunakan fungsi tx.Commit() untuk melakukan transaksi Jika ralat berlaku dalam transaksi, gunakan fungsi tx.Rollback() untuk melancarkan transaksi.

Ringkasan

Dengan menggunakan API yang disediakan oleh pakej go-sql-driver/mysql, kami boleh menyambung dan berinteraksi dengan pangkalan data MySQL dengan mudah. Dalam sistem teragih, menggunakan kumpulan sambungan untuk mengurus berbilang contoh pangkalan data MySQL boleh meningkatkan prestasi dan ketersediaan sistem. Bahasa Go juga menyediakan sokongan untuk penggunaan transaksi yang diedarkan, dan transaksi yang diedarkan boleh diuruskan dengan mudah melalui objek Tx.

Atas ialah kandungan terperinci Cara menyambung ke pangkalan data MySQL yang diedarkan menggunakan bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn