4

これは私の最初の Sinatra プロジェクトであり、かなり遅れており、ActiveRecord を使用する複数のリクエストを一度に行うと問題が発生することに気付きました。リクエストを 1 つだけ行うと、それぞれが独自に機能します。しかし、両方を同時に呼び出すと、失敗します。

これまでのところ、2 つの ActiveRecord リクエストが同時に発生するという問題に絞り込みました。ActiveRecord を正しく設定していないのでしょうか? Heroku が使用している PostgreSQL を使用しており、変更する気はありません。(問題は Heroku でも発生します。)

ログは次のとおりです。

192.168.1.113 - - [30/Sep/2012:10:33:00 MDT] "GET /version/current?platform=android HTTP/1.1" 200 33
 - -> /version/current?platform=android ActiveRecord::StatementInvalid - NoMethodError: undefined method `fields' for nil:NilClass: SELECT  "rankings".* FROM "rankings"  WHERE "rankings"."user_id" = 1 LIMIT 1:
/Users/zablanc/.rvm/gems/ruby-1.9.3-head@emm/gems/activerecord-3.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:667:in `block in exec_query'

...

Warning! Rack::Session::Cookie data size exceeds 4K.
Warning! Rack::Session::Cookie failed to save session. Content dropped.

192.168.1.113 - - [30/Sep/2012:10:33:01 MDT] "GET /badges/all HTTP/1.1" 200 311
 - -> /badges/all
192.168.1.113 - - [30/Sep/2012:10:33:01 MDT] "GET /moves/ranking/all HTTP/1.1" 500 166185
 - -> /moves/ranking/all

これらの Cookie の警告を黙らせる方法がわかりませんが、アプリには影響がないようです。アプリを構成する方法は次のとおりです(メインスクリプトから必要な構成ファイル内):

enable :logging

use ActiveRecord::ConnectionAdapters::ConnectionManagement

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :expire_after => 31_536_000, # In seconds
                           :secret => 'jeowkfj...secret...kjn5'

ActiveRecord::Base.include_root_in_json = false

def establish_connection(url)
    db = URI.parse(url)

    ActiveRecord::Base.establish_connection(
        :adapter  => db.scheme == 'postgres' ? 'postgresql' : db.scheme,
        :host     => db.host,
        :port     => db.port,
        :username => db.user,
        :password => db.password,
        :database => db.path[1..-1],
        :encoding => 'utf8'
    )
end

configure :development do
    establish_connection('postgres://postgres:postgres@localhost:5432/emm')
end

configure :test do
    establish_connection('postgres://postgres:postgres@localhost:5432/emm-test')
end

configure :production do
    establish_connection(ENV['DATABASE_URL'])
end

私は ActiveRecord を正しく設定していないと推測していますが、私が見たチュートリアルと同じだと思います。何を与える?

4

1 に答える 1

1

スレッドを使用しているように聞こえますが、アプリケーションにスレッドセーフでないコードが含まれています。

どの Web サーバーを使用しているか、どのミドルウェアを使用しているか、どの postgresql gem を使用しているか、すべての gem がスレッドセーフであることを確認しましたか?

于 2012-10-19T02:10:44.737 に答える