我正在一个使用 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!!")
有时我会获得最大连接数并且应用程序会死掉。