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

Implementing unique connections for each goroutine using firebirdsql

我打算同时从多个 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 运行时,一切正常,但是一旦我增加 goroutines 的数量,似乎 dbConnections 从其他 goroutines 搞砸了 sql 执行抱怨插入到不存在的表中!

如何创建 dbConnections 每个 goroutine 都有自己独特的版本?

编辑:

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