ZBLOG

go 封装一个sqlx,供各个线程调用

下面是一个示例的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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=7723

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?