下面是一个示例的Go代码,演示了如何封装sqlx并供多个线程调用:
package main
import (
"fmt"
"sync"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
type DBManager struct {
db *sqlx.DB
mu sync.Mutex
}
func NewDBManager() (*DBManager, error) {
db, err := sqlx.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
return nil, err
}
return &DBManager{
db: db,
}, nil
}
func (m *DBManager) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {
rows, err := m.db.Queryx(query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
columns, _ := rows.Columns()
result := make([]map[string]interface{}, 0)
for rows.Next() {
row := make(map[string]interface{})
values := make([]interface{}, len(columns))
for i := range columns {
values[i] = new(interface{})
}
err = rows.Scan(values...)
if err != nil {
return nil, err
}
for i, colName := range columns {
row[colName] = *(values[i].(*interface{}))
result = append(result, row)
}
return result, nil
}
func main() {
manager, err := NewDBManager()
if err != nil {
fmt.Println("Failed to create DB manager:", err)
return
}
// 在多个线程中并发调用查询方法示例
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
result, err := manager.Query("SELECT * FROM table_name WHERE column = ?", value)
if err != nil {
fmt.Println("Error executing query:", err)
return
}
fmt.Println(result) // 处理查询结果
}()
}
wg.Wait()
// 关闭数据库连接
manager.db.Close()
}
在上面的示例代码中,我们首先定义了一个DBManager
结构体,它封装了一个sqlx连接池。NewDBManager()
函数用于创建新的DBManager
实例并连接到MySQL数据库。Query()
方法执行SQL查询,并返回一个包含每行记录的map切片。
在主函数中,我们创建了一个DBManager
实例,并使用10个并发线程调用查询方法进行数据库查询操作。最后,我们关闭数据库连接。
请注意,在使用并发访问数据库时需要保证线程安全性。在示例代码中,我们使用了互斥锁(Mutex)来确保多个线程之间的安全访问。
内容由零声教学AI助手提供,问题来源于学员提问