在golang项目中的sqlx上查询后,数据库连接仍在使用中

时间:2019-04-24 12:01:50

标签: go sqlx

我正在使用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!!")

有时候我得到最大的连接,应用程序死了。

1 个答案:

答案 0 :(得分:0)

感谢@mkopriva! 我仍然不知道为什么仍然使用连接,但是为了解决我的问题,我使用了Tx并创建了一个defercommitrollback的函数(commit和rollback均返回错误,我在关闭连接时遇到问题,因为在Tx情况下):

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