2015-07-24 4 views
1

Я делаю пакетное вставку с помощью следующего методаActiveRecord :: StatementInvalid SQLite3 :: BusyException: база данных заблокирована в Batch Insert

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 insert, которую я пытаюсь выполнить. Когда я ставлю это прямо в dbconsole, он отлично работает. Какие-либо предложения?

ответ

0

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

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

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

+0

Просто увеличивая время не решить мою проблему. как насчет изменения размера пула, чтобы он не пытался использовать одновременный доступ ...? Любые другие предложения – TheJKFever