ご清聴ありがとうございました。しばらくアイドル状態になった後、接続が固まってしまったので、助けや試してみることができれば幸いです。
jruby 1.7.2のSinatraアプリで、ojdbc6.jarとともにactiverecord-oracle_enhanced-adapterのv1.4.1を使用しています。私のコントローラーはヘルパー クラス メソッドを呼び出し、json 文字列を返します。ヘルパー クラス メソッドは、Oracle データベースにデータをクエリするだけです。コードは次のようになります。
class App < Sinatra::Base
get '/customer/:id_number' do |id_number|
MyHelper.customer(id_number).to_json
end
end
class MyHelper
@dbconfig = YAML.load_file("../config/database.yml")
@dbenv = @dbconfig["#{settings.environment}"]
puts "establish_connection"
ActiveRecord::Base.establish_connection(@dbenv)
def self.customer(id_number)
begin
query = <<-SQL
SELECT * FROM customer WHERE cust_id = '#{id_number}'
SQL
puts 1
ActiveRecord::Base.connection.exec_query(query)
puts 2
rescue => e
puts 3
puts e.message
ensure
puts 4
ActiveRecord::Base.clear_active_connections!
puts 5
end
end
end
コントローラーを 50 回ヒットし、2 時間スリープして繰り返すシェル スクリプトがあります。開始時に 1 回の Establish_connection 呼び出しが表示されます (予想される)。予期しないことは、スリープの直後に、データベースへの最初の接続が常にスタックすることです。ログに表示されるのは「1」だけです。15 分後、クライアントはタイムアウトになり、コントローラーに別の呼び出しを行います。この 2 番目の呼び出しは、常にスレッド 1 を再開するという点で、接続プールを「目覚めさせる」効果があるように思われるため、「2」、「4」、および「5」が表示されます。同時に、スレッド 2 のログ メッセージ「1」、「2」、「4」、および「5」も表示されます。実際のコードは Thread.current.object_id をメッセージの一部として出力するため、これがわかりました。
ActiveRecord::Base.connection.verify を追加してみました!exec_query の直前ですが、スタックした呼び出しを検証行にシフトするだけです。
アダプターを正しく使用しましたか? 他に試せることはありますか?