1

次の方法でバッチ挿入を行っています

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 に直接入れると、正常に動作します。助言がありますか?

4

1 に答える 1

0

SQLite は、ここで実行している問題である同時アクセスに使用されることは実際には想定されていません。でタイムアウトを増やしてみることができますdatabase.yml

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

並行性を向上させるために別の db エンジンを使用することをお勧めします

于 2015-07-24T17:40:52.733 に答える