【问题标题】:ActiveRecord::StatementInvalid SQLite3::BusyException: database is locked in Batch InsertActiveRecord::StatementInvalid SQLite3::BusyException: 数据库在批量插入中被锁定
【发布时间】:2023-03-26 11:38:01
【问题描述】:

我正在使用以下方法进行批量插入

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 时,它​​工作正常。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord sqlite batch-insert


    【解决方案1】:

    SQLite 并不真正应该用于并发访问,这是您在这里遇到的问题。您可以尝试在database.yml 中增加超时时间

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

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

    【讨论】:

    • 只是增加时间并不能解决我的问题。如何更改池大小以使其不尝试使用并发访问...?任何其他建议
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2017-02-07
    • 1970-01-01
    • 2011-11-01
    • 2015-06-05
    • 2011-08-24
    • 2015-11-22
    相关资源
    最近更新 更多