SQL 连续性的读写有必要在每条数据读写时 open 和 close 吗

2017-03-04 13:02:10 +08:00
 Famio
有万+条数据要连续读写, sql 操作类中加了 open 和 close ,每条数据都会 open 下,写完再 close ……虽然这流程很标准,但我想这种连续性写入是不是可以不用 close 了?
现在软件跑一段时间后就会停止工作,查看错误日志时 sql 的问题……
2731 次点击
所在节点    程序员
15 条回复
Tom008
2017-03-04 13:33:27 +08:00
这情况不是要数据库连接池吗
m31271n
2017-03-04 13:37:02 +08:00
不需要频繁的 open / close 连接,因为这很消耗系统资源。

我的做法是:在内部缓存池中维护数据连接,当不再需要某连接时,就将其放回到连接池中,供下一个请求使用。

关于停止工作的问题:对系统资源做些监控,跟数据库日志的时间和信息进行对比,来定位为题。
Famio
2017-03-04 14:27:19 +08:00
@Tom008 @m31271n

谢谢二位回复,我这本身就是个辅助工具类的软件。结果就是要处理大量的 sql
对连接池不是很熟练,我再研究下。
huiyue
2017-03-04 14:30:29 +08:00
不需要事务?
zeraba
2017-03-04 17:43:50 +08:00
用事务啊
ebony0319
2017-03-04 17:51:33 +08:00
关键字:连接池。
还有一个就是静态类,只打开一次。
chaleaoch
2017-03-04 18:14:40 +08:00
搭楼请教另一个问题, 什么是 cursor,游标?
cursor 存在的意义是什么.
例如我 connect 一个 db 之后,还要在获取一个 cursor,然后用这个句柄去 execute 或者 fetchall 什么的.最后 close cursor,close db,

在这里我们会发现,cursor 和 db 的功能是重复的.open/connect 了两遍,close 了两遍.

是不是有什么我不知道的高级用法?导致这个游标是有存在意义的?

谢谢.
greatonce
2017-03-04 18:27:27 +08:00
你应该多想想 “复用” 是什么意思
m31271n
2017-03-04 18:48:13 +08:00
@chaleaoch 个人理解,游标是数据库中的一种控制结构,用来遍历数据库中的记录。类似于编程语言的迭代器。

举例:一次查询有 10W 条记录,这 10W 条记录都一次读出来,还是一点一点地读呢?

(重新开帖,搭什么车)
chaleaoch
2017-03-04 19:02:30 +08:00
@m31271n 但是我可以把数据库做成一个迭代器.
所以我还是觉得游标应该有另一些我不知道的高级用法在里面.
m31271n
2017-03-04 19:26:14 +08:00
chaleaoch
2017-03-04 19:32:07 +08:00
@m31271n 那就是说和我想的差不多,游标并不一定是必须存在的,它只是一个"工具",有它会更好.
m31271n
2017-03-04 19:39:33 +08:00
@chaleaoch 恩,在数据量大,但对一致性要求不高的情况下使用。个人会把它归在性能优化里,平时开发也不考虑。
ebony0319
2017-03-04 22:04:28 +08:00
@chaleaoch 游标有点类似于 reader ,一行行读取。将查询的数据一次性装入内存当然更快,但是数据行很多这时候游标的意义就出来了。
qile1
2017-03-05 15:50:04 +08:00
楼上有没有具体示例,参考下,现在我也是查询每次都打开关闭数据库一次

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344847

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX