Rumah > Artikel > pangkalan data > Cara menyambung ke pangkalan data MySQL yang diedarkan menggunakan bahasa Go
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.
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
go get -u github.com/go-sql-driver/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) } }
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 {} }
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 teragihApabila 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") } }
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!