Невозможно закрыть базу данных sqlite3 с помощью ruby - PullRequest
0 голосов
/ 02 мая 2019
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.

1 Ответ

1 голос
/ 02 мая 2019

Помогло чтение исходного кода для гема ruby.В частности, следующий кодовый блок файла Statement.c :

/* call-seq: stmt.close
 *
 * Closes the statement by finalizing the underlying statement
 * handle. The statement must not be used after being closed.
 */
static VALUE sqlite3_rb_close(VALUE self)
{
  sqlite3StmtRubyPtr ctx;

  Data_Get_Struct(self, sqlite3StmtRuby, ctx);

  REQUIRE_OPEN_STMT(ctx);

  sqlite3_finalize(ctx->st);
  ctx->st = NULL;

  return self;
}

Таким образом, использование .close в выражении (например, dbins.close после .execute в моем коде) завершитсязаявление и дать мне возможность закрыть файл базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...