postgresql - 了解数据库/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()
?
解决方案
根据文档Rows
:
如果调用 Next 并返回 false 并且没有进一步的结果集,则 Rows 将自动关闭,并足以检查 Err 的结果。
由于您迭代了所有结果,因此结果集是关闭的。
推荐阅读
- javascript - JQuery函数没有响应按钮之间的导航
- javascript - 无法使用 JS Ajax 启用禁用提交(由 php 回显提交)
- php - 从 Laravel 中的存储档位生成带有动态图像的 PDF
- ruby-on-rails - 有条件地包含属性是创建方法 - Rails 5
- android - 从 LatLng 获取地址
- android - 在 Flutter 上捕获 Android 后退按钮事件
- asp.net-core - Minio 大文件上传 C# SDK
- python - 单元测试结构和导入
- java - 需要使用 java 使用数组更新 DB 中的一组记录
- java - JavaEE 8、Tomcat 8.5、错误状态 404