gpt4 book ai didi

go - 在 golang 项目中查询 sqlx 后数据库连接仍在使用中

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:45 25 4
gpt4 key购买 nike

我在一个使用 sqlx 和 postgres 的 golang 项目中工作。当应用程序启动时,我打开一个与数据库的连接并像这样使用它:

var connRO *sqlx.DB
var connRW *sqlx.DB
...

/ GetInstance - will return the connection opened to the database
func GetInstance(readonly bool) *sqlx.DB {

if readonly {
return connRO
}

return connRW
}

问题是在某些代码块中连接仍在使用中,这里有一个例子:

instanceRW := database.GetInstance(false)
instanceRO := database.GetInstance(true)
...

err := instanceRO.Get(&idFuncionario, `
SELECT id
FROM t_funcionario
WHERE codigo_externo = $1 `,
i.FuncionarioID)
if err != nil {
log.Println(err)
return errors.New("Erro ao identificar funcionário.")
}

// Verifica se o item é granel
// Caso não seja
if *i.ItemGranelID == 0 {
// Verifica se o item está disponível
err = instanceRO.Get(&localidade_id, `
SELECT COALESCE(localidade_id, 0)
FROM t_item
WHERE id = $1
`, i.ItemID)
if err != nil {
log.Println(err)
return errors.New("Não foi possível identificar tipo do item.")
...
}

当我尝试测试它做类似的事情时,测试不会打开很多连接。这里有一些测试代码:

i := 600
for i != 0 {
if true {
err := db.Select(&item, `SELECT * FROM t_item LIMIT 10`)
if err != nil {

}
err = db.Select(&categoria, `SELECT * FROM t_categoria LIMIT 10`)
if err != nil {

}
err = db.QueryRow(`INSERT INTO t_categoria
(
nome,
ativo
)
VALUES ($1, $2)`, fmt.Sprintf("cateToTeste%v", i), true).Scan(&itemget)
if err != nil {

}

err = db.Get(&itemget, `SELECT COALESCE(localidade_id, 0)
FROM t_item
WHERE id = $1`, 150)
if err != nil {

}

log.Println("ok")
i--
}
}
log.Println("Tudo ok!!")

有时我获得了最大连接数,应用程序死机了。

最佳答案

感谢@mkopriva!我仍然不知道为什么连接仍在使用中,但为了解决我的问题,我使用了 Tx 并创建了一个函数来defer commitrollback(提交和回滚都返回错误,我在关闭连接时遇到问题,因为 - 在 Tx 情况下):

func commitORRollback(db *sqlx.Tx, ROLLBACK *bool) {
if *ROLLBACK {
if err := db.Rollback(); err != nil {
...
}
} else {
...
}
}

关于go - 在 golang 项目中查询 sqlx 后数据库连接仍在使用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829601/

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