gpt4 book ai didi

go - 使用 firebirdsql 为每个 goroutine 实现唯一的连接

转载 作者:行者123 更新时间:2023-12-01 22:23:07 25 4
gpt4 key购买 nike

我打算同时从多个 goroutine 填充多个 firebird 数据库,为了做到这一点,我的 worker函数有一个映射( dbConnections ),它保存到数据库的连接(将数据库的名称映射到连接):

func worker() {
dbConnections := map[string]*sql.DB {}
for dbName, dbFileName := range dbFiles {
connection, err := sql.Open("firebirdsql", ("sysdba:master@localhost:3050/" + url.PathEscape(dbsPath + dbFileName)))
err = connection.Ping()
if err != nil {
fmt.Println("Ping failed: ", err.Error()
return
} else {
dbConnections[dbName] = connection
fmt.Println(fmt.Sprintf("Connected to the: %v", dbName))
defer dbConnections[dbName].Close()
}
}

// using the connections to populate databases...
// ...
}

问题是当我运行 worker仅作为 1 个 goroutine 运行,一切正常,但是一旦我增加 goroutine 的数量,似乎 dbConnections来自其他 goroutines 被搞砸了,sql 执行提示插入到不存在的表中!

如何创建 dbConnections以这样一种方式,每个 goroutine 都有自己独特的版本吗?

编辑:
  • Go版本:v1.14.2.windows-amd64
  • firebirdsql版本:v0.0.0 (f095ac7) (Published: May 5, 2020)
  • 最佳答案

    正如评论部分中提到的那样,问题是由于线程安全
    firebirdsql尤其是在创建新表时。定义 mutex并在mutex.Lock()之间加上sql执行方法和 mutex.Unlock() (这样在任何给定时间只有一个 goroutine 可以创建表)解决了这个问题。

    关于go - 使用 firebirdsql 为每个 goroutine 实现唯一的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756540/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com