ActiveRecord :: StatementInvalid SQLite3 :: BusyException:数据库在批量插入

时间:2015-07-24 17:14:37

标签: ruby-on-rails ruby activerecord sqlite 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时,它工作正常。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

SQLite实际上并不应该用于并发访问,这是您遇到的问题。您可以尝试在database.yml

中增加超时
development:
  adapter: sqlite3
  database: db/my_dev.sqlite3
  timeout: 10000

最好使用另一个数据库引擎来提高并发性