2016-11-11 1 views
2

Ruby on Rails에서 실행중인 Heroku App에 Postgis DB를 사용하도록 Postgres DB를 설정했습니다.컨트롤러를 postgres에 사용하는 문제 Heroku 앱의 AWS RDS DB

내 단계되었습니다

  1. 는 RDS 매개 변수 그룹에 rds.force_ssl 사용 페이지를 9.4.9
  2. 를 실행 RDS DB를 생성합니다.
  3. 새로운 Postgres DB에 Heroku 데이터베이스를 백업하고로드하십시오.
  4. Amazon RDS CA 인증서를 다운로드하여 config/amazon-rds-ca-cert.pem에 저장하십시오.
  5. gem 파일에 'activerecord-postgis-adapter'를 추가하십시오.
  6. 업데이트 아래에 database.yml을 파일 :

:

default: &default 
    adapter: postgis 
    encoding: unicode 
    pool: 5 

production: 
    <<: *default 
    encoding: utf8 
    database: <%= ENV['RDS_DB_NAME'] %> 
    username: <%= ENV['RDS_USERNAME'] %> 
    password: <%= ENV['RDS_PASSWORD'] %> 
    host: <%= ENV['RDS_HOSTNAME'] %> 
    port: <%= ENV['RDS_PORT'] %> 
    postgis_extension: postgis 
    schema_search_path: public,postgis 
    포스트 그레스에 Heroku가에
  1. 업데이트 DATABASE_URL 매개 변수를 : // 참고 MyUser : mypassword @ mydbinstance .xxxxxxxxxxx.us - 서쪽 2.rds.amazonaws.com/mydbname sslmode = 확인-전체 & sslrootcert = 설정/아마존-RDS-CA-cert.pem이 매우 도움이 질문에
  2. 추가 단계 : Enabling Ruby PostGIS support on Heroku
  3. 업데이트 된 코드를 푸시하고 내 앱에 액세스하십시오.

    nc -zv mydbinstance.xxxxxxxx.us-west-2.rds.amazonaws.com 5432 
    Connection to mydbinstance.xxxxxxxxx.us-west-2.rds.amazonaws.com 5432 port [tcp/postgresql] succeeded! 
    

    을 내가 응용 프로그램을 탐색 할 때 나는 쿼리의 결과를 볼 수 있어요 : 내가 연결을 확인하기 위해 데이터베이스에 액세스하려고하면

은 괜찮 작동합니다. 그러나 포스트 기어를 사용하는 모델을 사용하려고하면 어떻게 든 연결이 제대로 작동하지 않습니다. 여기 위도 저장 내 컨트롤러의 코드, 버스 정류장 정보와 LNG 쌍, 그리고 매개 변수에 주어진 점에 가까운 사람 찾습니다

class TransitStopsController < ApplicationController 
    def create 
    end 

    def show 
     @transit_stop = TransitStop.find(params[:id]) 
     @transit_routes = @transit_stop.transit_routes 
    end 

    def get_nearby_stops 
     radius_in_meters = params[:radius_in_meters].nil? ? 3219 : params[:radius_in_meters] 
     @nearby_stops = TransitStop.close_to(params[:lat], params[:lng], radius_in_meters) 
    end 
end 

내 모델 :

class TransitStop < ActiveRecord::Base 
    has_many :transit_stops_transit_routes, foreign_key: "onestop_id", class_name: "TransitStopsTransitRoute" 
    has_many :transit_routes, through: :transit_stops_transit_routes, foreign_key: "route_onestop_id", class_name: "TransitRoute" 
    validates_uniqueness_of :onestop_id 

    #Get transit stops close to a given lat, lng pair. Default distance = 2 miles 
    scope :close_to, -> (lat, lng, distance_in_meters = 3219) { 
    where(%{ 
    ST_DWithin(
     ST_GeographyFromText(
      'SRID=4326;POINT(' || transit_stops.lng || ' ' || transit_stops.lat || ')' 
     ), 
     ST_GeographyFromText('SRID=4326;POINT(%f %f)'), 
     %d 
    ) 
    } % [lng, lat, distance_in_meters]) 
    } 
end 

내보기 (get_nearby_stops를 .jbuilder)

Routes.rb 라인 액세스 방법에 추가 한
json.nearby_stops @nearby_stops do |transit_stop| 
    json.region_id transit_stop.region_id 
    json.lat transit_stop.lat 
    json.lng transit_stop.lng 
    json.onestop_id transit_stop.onestop_id 
    json.name transit_stop.name 
    json.osm_way_id transit_stop.osm_way_id 
    json.osm_way_id transit_stop.served_by_vehicle_types 
    json.timezone transit_stop.timezone 
    json.wheelchair_boarding transit_stop.wheelchair_boarding 
    json.created_or_updated_in_changeset_id transit_stop.created_or_updated_in_changeset_id 
    json.transit_routes transit_stop.transit_routes 
end 

:

012,340,630,994,176,816,

나는 통해이 액세스하려고하면 :

응용 프로그램 오류

오류가 응용 프로그램에서 발생하여 페이지를 제공 할 수 없습니다 https://myherokuapp.herokuapp.com/transit_stops/get_nearby_stops.json?lat=-122.49766&lng=37.71677

내가 할 모든 메시지입니다. 응용 프로그램 소유자 인 경우 자세한 내용은 로그를 확인하십시오.

app[web.1]: Processing by TransitStopsController#get_nearby_stops as JSON 
app[web.1]: Parameters: {"lat"=>"-122.49766", "lng"=>"37.71677"} 
heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/transit_stops/get_nearby_stops.json?lat=-122.49766&lng=37.71677" host=myherokuapp.herokuapp.com request_id=1e081fdf-d0ce-4000-a6b4-4e75c176b8a2 fwd="10.0.0.1" dyno=web.1 connect=0ms service=30001ms status=503 bytes=0 

AWS 오류 로그는 아무것도 보여주지 :

내 Heroku가 내가 보는 모든 기록을보고

시간 초과 오류입니다. 나는이 컨트롤러는 경우에만 실패 원인을 이해하지 않는이 시점에서 그래서

irb(main):001:0> TransitStop.close_to(-122.49766,37.71677,5000) 
=> #<ActiveRecord::Relation [#<TransitStop region_id: 1, lat: #<BigDecimal:7fe69f6c95c0,'-0.122504106E3',18(18)>... 
... 
etc 

:

나에게 이상한 것은 내가 Heroku가의 레일 콘솔에 연결하여 동일한 쿼리를 수행 할 수있게되었습니다이다 내보기를 통해 액세스하지만 콘솔을 통해 액세스하지 못합니까? Postgis 메서드를 사용하면 데이터베이스 URL이 달라야합니까?

도움을 주시면 감사하겠습니다.

편집 : 나는 내 컨트롤러의 표시 방법을 테스트 한, 그것은 확인을 작동합니다

app<a class="jive-link-external" href="http://web.1">http://web.1</a>: Started GET "/transit_stops/s-9q8ys6puje-655johnmuirave.json" for 159.16.243.2 at 2016-11-12 19:55:16 +0000 
app<a class="jive-link-external" href="http://web.1">http://web.1</a>: Processing by TransitStopsController#show as JSON 
app<a class="jive-link-external" href="http://web.1">http://web.1</a>: Parameters: {"id"=>"s-9q8ys6puje-655johnmuirave"} 
heroku<a href="https://forums.aws.amazon.com/">router</a>: at=info method=GET path="/transit_stops/s-9q8ys6puje-655johnmuirave.json" host=myapp.herokuapp.com request_id=15814367-5235-484b-bff9-7727a2349dd0 fwd="10.0.0.1" dyno=web.1 connect=0ms service=329ms status=200 bytes=1385 
app<a class="jive-link-external" href="http://web.1">http://web.1</a>: Rendered transit_stops/show.json.jbuilder (107.3ms) 
app<a class="jive-link-external" href="http://web.1">http://web.1</a>: Completed 200 OK in 217ms (Views: 6.7ms | ActiveRecord: 207.4ms)<br class="jive-newline" /> 

내가 뭘 쿼리를 수행하기 위해 데이터베이스에 약간의 문제가있는에 아마가 번역 나에게 어떤 ? 콘솔에서 테스트 할 때 항상 즉시 응답을 얻으므로 쿼리 자체가 빠르지 만 데이터베이스 구성에 대한 변경이 필요합니다. 다른 사람들이 볼 수 있도록

답변

0

그냥, 내 문제는 필드

transit_stop.transit_routes 

다른 테이블에 관계가 있기 때문에 쿼리 후, 내보기도, 몇 가지 추가 쿼리를 생산 한 것이 었습니다. 따라서 모든 결과 정지에 대해 데이터베이스는 내가 얻은 모든 결과에 대해 다른 많은 쿼리를 수행하고있었습니다. 내 쿼리가 수백 개의 결과를 반환했기 때문에 최종 뷰는 수백 개의 추가 쿼리를 수행하여 데이터베이스에 많은 오버 헤드를 유발했습니다.

이를 감지하기 위해 데이터베이스에 들어오는 모든 활동을 볼 수 있도록 log_statement = all을 db 매개 변수 그룹으로 업데이트했습니다. 나는 많은 결과를 얻는데 전혀 쓸모가 없으므로 결과를 n 개의 가장 가까운 것만으로 줄이고 최대 10 개로 결과를 줄임으로써 쿼리를 업데이트했습니다.