ActiveRecord::StatementInvalid SQLite3::BusyException: база данных заблокирована в пакетной вставке

Я делаю пакетную вставку следующим методом

module DatabaseHelper

  ActionHelper = ActionController::Base.helpers
  CONN = ActiveRecord::Base.connection

  def self.mass_sql_insert(klass, columns, values, batch_size = 500)
    table = klass.constantize.table_name if klass.constantize.kind_of?(Class)
    values.each_slice(batch_size) do |batch|
      sql = ActionHelper.sanitize("INSERT INTO #{table} (#{columns.join(', ')}) VALUES #{batch.join(', ')}")
      CONN.execute sql
    end
  end

Этот метод отлично работал, но совсем недавно начал выдавать следующую ошибку:

ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked:

За этой ошибкой следует команда вставки sql, которую я пытаюсь выполнить. Когда я помещаю это прямо в dbconsole, все работает нормально. Какие-либо предложения?


person TheJKFever    schedule 24.07.2015    source источник


Ответы (1)


SQLite на самом деле не должен использоваться для одновременного доступа, что является проблемой, с которой вы здесь сталкиваетесь. Вы можете попробовать увеличить время ожидания в своем database.yml

development:
  adapter: sqlite3
  database: db/my_dev.sqlite3
  timeout: 10000

лучше использовать другой механизм БД для улучшения параллелизма

person Rajarshi Das    schedule 24.07.2015
comment
Простое увеличение времени не решает мою проблему. как насчет изменения размера пула, чтобы он не пытался использовать одновременный доступ...? Любые другие предложения - person TheJKFever; 01.08.2015