我正在使用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!!")
有时候我得到最大的连接,应用程序死了。
答案 0 :(得分:0)
感谢@mkopriva!
我仍然不知道为什么仍然使用连接,但是为了解决我的问题,我使用了Tx
并创建了一个defer
或commit
或rollback
的函数(commit和rollback均返回错误,我在关闭连接时遇到问题,因为在Tx
情况下):
func commitORRollback(db *sqlx.Tx, ROLLBACK *bool) {
if *ROLLBACK {
if err := db.Rollback(); err != nil {
...
}
} else {
...
}
}