2016-09-29 7 views
1

。INSERT INTO、それは私が、私は以下のようなメッセージを持って、MVCでそれを実行するとするSQLite3 :: BusyException:データベースがロックされている:私はタスクとコードのこの部分を実行すると

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 

作品:

はActiveRecord :: StatementInvalid(SQLite3の:: BusyException:データベースがロックされている:私はのGSSモデルで機能に上記のコードを入れている

インポートがにルーティングされてGETしてブラウザから起動される を。モデルインポート関数を呼び出すコントローラ インポートが完了すると、レコードの完全なリストがビューに返されます。 csvファイルには4k行があります。 インポートのプロセスに時間がかかり、正確に60秒後にGETが再送されるようです。 インポートをクラッシュさせるこの再送信を回避する方法を教えてもらえますか?

答えて

4

トランザクションでこれをラップすると、一度に1つではなくすべてのクエリが一緒に実行されます。これにより、多くの行のインポートを実行するのにかかる時間が大幅に短縮されます。 http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

+0

ありがとう:ここでは取引上の

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 

もっと読みます!それは知っている働く。このようなGETを再送するタイムアウトはどうですか?それを避ける方法はありますか? – user3239711

+0

私は気づいていない、私はサーバーがクライアント側を制御しているとは思わない?私は確信していません。今のところアクションは60秒以下かかりますか? – RichardAE

+0

しかし、私はラガーファイルをアップロードする必要がある場合は?私はそれがブラウザから来るかどうか疑問に思います。この場合、データベースがビジー状態であることをテストして衝突を回避できるかどうか – user3239711

関連する問題