2016-09-29 71 views
1

當我運行這段代碼有一個任務,它的工作原理的SQLite3 :: BusyException:數據庫被鎖定:INSERT INTO

task :importGss => :environment do 
    Gss.delete_all 
    file = Rails.root + "app/assets/CSVs/gss.csv" 
    csv_text = File.read(file) 
    puts csv_text.size 
    csv = CSV.parse(csv_text, :col_sep => ';', :headers => true) 
    csv.each do |row| 
    Gss.create!(row.to_hash) 
end 

當我與一個MVC運行它,我有以下消息:

的ActiveRecord :: StatementInvalid(SQLite3的:: BusyException:數據庫被鎖定:

我在GSS模型把上面的代碼中的函數 進口從具有獲取瀏覽器被路由到啓動。控制器調用模型導入功能 導入完成後,應將完整的記錄列表返回到視圖。 csv文件有4k行。 導入過程需要時間,並且似乎恰好在60秒後重新發送GET。 有人可以解釋我如何避免這種重新發送導致崩潰導入?

回答

4

在事務中包裝它將確保所有查詢一起運行,而不是一次運行1次。這將大大減少爲多行執行導入所花費的時間。

task :importGss => :environment do 
    Gss.delete_all 
    file = Rails.root + "app/assets/CSVs/gss.csv" 
    csv_text = File.read(file) 
    puts csv_text.size 
    csv = CSV.parse(csv_text, :col_sep => ';', :headers => true) 

    ActiveRecord::Base.transaction do 
     csv.each do |row| 
     Gss.create!(row.to_hash) 
     end 
    end 
end 

瞭解更多關於交易的位置:http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

+0

謝謝!它的作品知道。這種重新發送GET的超時會怎麼樣?有沒有辦法避免這種情況? – user3239711

+0

我不知道任何,我不認爲服務器控制,即客戶端?雖然我不確定。這個動作現在不到60秒,但是正確嗎? – RichardAE

+0

是的,但如果我需要上傳啤酒文件?我不知道它是否來自瀏覽器。在這種情況下,是否有可能測試數據庫繁忙以避免衝突的事實 – user3239711