使用 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 都有自己独特的版本?
编辑:
Go
版本:v1.14.2.windows-amd64
firebirdsql
版本:v0.0.0 (f095ac7) (Published: May 5, 2020)
正如评论部分中提到的那样,问题是因为线程安全
在 firebirdsql
中,尤其是在创建新表时。定义一个 mutex
并在 mutex.Lock()
和 mutex.Unlock()
之间包含 sql 执行方法(以便在任何给定时间只有一个 goroutine 可以创建表)解决了问题。
我打算同时从多个 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 都有自己独特的版本?
编辑:
Go
版本:v1.14.2.windows-amd64firebirdsql
版本:v0.0.0 (f095ac7) (Published: May 5, 2020)
正如评论部分中提到的那样,问题是因为线程安全
在 firebirdsql
中,尤其是在创建新表时。定义一个 mutex
并在 mutex.Lock()
和 mutex.Unlock()
之间包含 sql 执行方法(以便在任何给定时间只有一个 goroutine 可以创建表)解决了问题。