代码之家  ›  专栏  ›  技术社区  ›  agusgambina

Ruby on Rails请求/查询超时

  •  1
  • agusgambina  · 技术社区  · 7 年前

    我有一个Rails应用程序,它已经工作了一段时间。现在,我 我在生产中遇到问题,因为请求检索超时。这看起来很奇怪,因为数据库只有12MB的重量。

    我安装了 pg_hero ,并更改了数据库配置,但是,这并没有解决问题。

    在Gemfile中,重要的宝石如下

    gem 'rails',                      '5.0.1'
    gem 'pg',                         '0.18.4'
    gem 'ransack',                    '1.8.0'
    gem 'autonumeric-rails',          '1.9.43'
    gem 'axlsx',                      '2.0.1'
    gem 'axlsx_rails',                '0.5.2'
    gem 'pghero'
    gem 'pg_query', '>= 0.9.0'
    

    这是控制器中的代码

    def download
      @q = current_consultant.admin? ? @q = Task.ransack(params[:q]) : @q = Task.where(:consultant_id => current_consultant.id).ransack(params[:q])
      @q.sorts = ['task_date desc'] if @q.sorts.empty?
      @tasks = @q.result(distinct: true)
      render xlsx: "tasks", template: "/tasks/download.xlsx.axlsx"
    end
    

    这是模型中的代码

    def self.worked(id)
      query_sql ="
      SELECT
        consultants.id as consultant_id,
        clients.name as client,
        categories.name as category_name,
        tasks.task_date as start_time,
        SUM(tasks.hours * 60 + tasks.minutes) as name
        FROM consultants
        INNER JOIN tasks ON consultants.id = tasks.consultant_id
        INNER JOIN clients ON tasks.client_id = clients.id
        INNER JOIN categories ON tasks.category_id = categories.id
        WHERE consultants.id = #{id}
        GROUP BY clients.id, consultants.id, tasks.task_date, categories.id;
      "
      Consultant.find_by_sql(query_sql)
    end
    

    这是axlsx文件

    wb = xlsx_package.workbook
    wb.add_worksheet(name: "Carga de Horas") do |sheet|
      title = sheet.styles.add_style(:bg_color => "55FF0000", :fg_color=>"FFFFFFFF", :border=>Axlsx::STYLE_THIN_BORDER, :alignment=>{:horizontal => :center})
      time_title = sheet.styles.add_style(:bg_color => "55FF0000", :fg_color=>"FFFFFFFF", :border=>Axlsx::STYLE_THIN_BORDER, :alignment=>{:horizontal => :center}, :num_fmt => 46)
      text = sheet.styles.add_style(:alignment=>{:horizontal => :center})
      date = wb.styles.add_style :num_fmt => 15
      time = wb.styles.add_style :num_fmt => 20
      currency = wb.styles.add_style :num_fmt => 5
    
      sheet.add_row [
        "Consultor",
        "Recurrente",
        "Cliente",
        "Fecha",
        "Duración",
        "Sector",
        "Tarea",
        "Comentarios"
      ], :style => title
      @tasks.each do |task|
          sheet.add_row [
            task.consultant.full_name,
            "=IF(#{task.recurrent},\"SI\",\"NO\")",
            task.client.name,
            task.task_date,
            "=#{task.duration}/1440",
            task.category.name,
            task.subcategory.name,
            task.comments
          ], :style => [
            text,
            text,
            text,
            date,
            time,
            text,
            text,
            text
          ]
      end
      range_amount = "E2:E#{@tasks.size+1}"
      range_iva = "F2:F#{@tasks.size+1}"
      sheet.add_row ["Total", nil, nil, nil, "=SUM(#{range_amount})", nil, nil, nil], :style => [title, title, title, title, time_title, title, title, title]
    end
    

    中的行数

    consultans -> 25
    tasks -> 14420
    clients -> 133
    categories -> 4
    subcategories -> 49
    

    在数据库中执行的查询大约持续70秒

    我不确定是否有办法解决这个问题

    1 回复  |  直到 7 年前
        1
  •  0
  •   engineerDave    7 年前

    您是使用nginx还是apache作为转发代理?通常,它们有一个默认的超时窗口~60秒,与此行为匹配。