我正在使用以下方法进行批量插入
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时,它工作得很好。有什么建议吗?
SQLite实际上不应该用于并发访问,这是您在这里遇到的问题。您可以尝试增加database.yml
development:
adapter: sqlite3
database: db/my_dev.sqlite3
timeout: 10000
最好使用另一个db引擎来提高并发性