4

ご清聴ありがとうございました。しばらくアイドル状態になった後、接続が固まってしまったので、助けや試してみることができれば幸いです。

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 の直前ですが、スタックした呼び出しを検証行にシフトするだけです。

アダプターを正しく使用しましたか? 他に試せることはありますか?

4

1 に答える 1