【发布时间】:2019-09-21 09:51:30
【问题描述】:
begin
db = SQLite3::Database.open "dbfile.db"
dbins = db.prepare("INSERT INTO table(a,b,c) VALUES (?,?,?);")
dbins.execute(vala,valb,valc)
rescue SQLite3::Exception => e
puts("Something went wrong: " + e)
ensure
db.close if db
end
这就是我用来打开 SQLite3 数据库并向其中写入数据的代码。
我的问题是这段代码总是给我以下错误:
unable to close due to unfinalized statements or unfinished backups
如果我删除 db.close if db 部分,它可以工作,但在脚本运行几个小时后,我收到 too many open files 错误。请不要建议我提高我的 inode 文件限制,那只是解决更大问题的临时解决方案。
我不希望脚本只是让数据库永远打开,每当发生事件时,我希望它打开数据库、写入数据并再次关闭它,这正是它的预期工作方式。
请注意,由于评论中的原因,this 的答案没有帮助,这是真的。
我必须做些什么来“完成”语句才能关闭数据库?我试图在关闭数据库之前添加一个sleep(5),但这没有效果。
我发现this Q 建议在声明中使用finalize,但这似乎只与 C/C++ 接口相关,与 ruby 的 sqlite3 无关。
【问题讨论】: