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, это лишь временное решение более серьезной проблемы.
Я не хочу, чтобы скрипт всегда оставлял базу данных открытой всегда, когда происходит событие, которое я хочучтобы открыть базу данных, записать данные и снова закрыть, как это должно работать.
Обратите внимание, что этот ответ не помогает по причине, указанной в комментарии,что верно.
Что мне нужно сделать, чтобы "закончить" утверждение, чтобы я мог закрыть базу данных?Я пытался просто добавить sleep(5)
перед закрытием базы данных, но это не имело никакого эффекта.
Я нашел this Q, предлагающий использовать finalize наутверждение, но это, кажется, относится только к интерфейсу C / C ++, а не к sqlite3 ruby.