Ruby on Rails并发数据库请求崩溃



我的Rails 4应用程序有一个每小时运行一次的进程,它从一个。csv文件中的数据在数据库中创建/更新100,000多条记录。

当此进程运行时,应用程序的最终用户也试图访问数据库密集型页面(选择数千条记录)。这会导致应用程序超时/崩溃。当上述进程未运行时,这些页面加载速度很快。

我试过使用"EM.defer"one_answers"Thread"。新的",但我认为这是我的数据库变得过载(CPU和内存都很好)。同样的问题发生在使用细螺纹和客运。

下面是加载数据到ActiveRecord的代码:

  def load_records # load thousands of records from CSV files
    EM.defer do
      loadRecordsFromCSV
    end
  end
  def loadRecordsFromCSV
    require "csv"
    csvfile =  "./lib/csvfile.csv" # 100,000+ lines
    CSV.foreach(csvfile) do |row|
      d = row[0]
      s = row[1]
      g = row[2]
      ss = row[3]
      n = row[4]
      c = row[5]
      cc = row[6]
      p = row[7]
      ad = row[8]
      av = row[9]
      params = { d: d, s: s, g: g, ss: ss, n: n, c: c, cn: cn, p: p, ad: ad, av: av }
      existingFoo = Foo.find_by(d: d, s: s, c: c)
      if existingFoo != nil
        existingFoo.update(params)
      else
        Foo.create(params)
      end
    end
  end

有没有一种方法来设置这个不会冻结/减慢我的应用程序,而它正在运行?这个过程需要几分钟,每小时冻结应用程序这么长时间是不可能的。

我已经尝试使用原始SQL而不是ActiveRecord,并且还首先写入临时表,但同样的问题正在发生。

这是我的第一个RoR项目,所以任何帮助都是非常感谢的!

问题已解决。我使用原始SQL而不是ActiveRecord重写了我的记录加载函数,最重要的是,我从加载函数周围删除了"EM.defer"。似乎我不知道如何正确使用EventMachine,它实际上是干扰多线程。我希望切换到Postgres或MySQL生产希望提高性能。

最新更新