首页 > 解决方案 > 了解数据库/sql

问题描述

我正在玩这个database/sql包,试图看看它是如何工作的,并了解如果你不打电话rows.Close()等会发生什么。

因此,我编写了以下代码用于将模型插入数据库:

func (db Database) Insert(m model.Model) (int32, error) {
    var id int32

    quotedTableName := m.TableName(true)

    // Get insert query
    q, values := model.InsertQuery(m)

    rows, err := db.Conn.Query(q, values...)
    if err != nil {
        return id, err
    }

    for rows.Next() {
        err = rows.Scan(&id)

        if err != nil {
            return id, err
        }

    }

    return id, nil
}

我不是rows.Close()故意打电话来看看后果。设置数据库连接时,我设置了一些属性,例如:

conn.SetMaxOpenConns(50)
conn.SetMaxIdleConns(2)
conn.SetConnMaxLifetime(time.Second*60)

然后我尝试插入 10000 条记录:

for i := 0; i < 10000; i++ {
    lander := models.Lander{
        // ...struct fields with random data on each iteration
    }

    go func() {
        Insert(&lander)
    }()
}

(它缺乏错误检查、上下文超时等,但为了玩转它可以完成工作)。当我从上面执行一段代码时,我希望至少会看到一些关于数据库连接的错误,但是数据会毫无问题地插入(所有 10000 条记录)。当我检查时,Stats()我看到以下内容:

{MaxOpenConnections:50 OpenConnections:1 InUse:0 Idle:1 WaitCount:9951 WaitDuration:3h9m33.896466243s MaxIdleClosed:48 MaxLifetimeClosed:2}

由于我没有打电话rows.Close(),我希望看到更多的 OpenConnections 或更多的 InUse 连接,因为我从不释放连接(也许我可能错了,但这是Close()释放连接并将其返回到池中的目的)。

所以我的问题只是这些是什么Stats()意思,为什么在插入时没有任何错误。另外,为什么没有更多的 OpenConnections 或 InUse ,不调用的真正后果是什么Close()

标签: postgresqlgo

解决方案


根据文档Rows

如果调用 Next 并返回 false 并且没有进一步的结果集,则 Rows 将自动关闭,并足以检查 Err 的结果。

由于您迭代了所有结果,因此结果集是关闭的。


推荐阅读