Rails 2.2 and Connection Pooling
C・ナッターのスレッドセーフRailsに関するブログ記事が大きな話題になっていますが、まもなくそのスレッドセーフであるRails2.2が登場します。
この2.2からスレッドセーフになることにより、以前取り上げた通り、従来まではActiveRecordではデータベース接続が1つで使い回していたものが、コネクションプーリングを行うことができるようになるようです。
2.2からはdatabase.ymlにpoolパラメータが追加され、以下のような設定でプール数を設定可能になります。
development:
adapter: mysql
username: root
database: myapp_dev
pool: 10
ナッターの文章にもありますが、スレッドセーフになることにより、JRubyを使えば、RubyのスレッドはJavaを経由してカーネルネイティブスレッドへと展開されるため、従来よりはるかに高いスケーラビリティを得ることができるようになるはずです。またJDBCのコネクションプールをJRubyから使うことにも意味が出てきて、より信頼性が高く、効率的になるはずです。
2008/09/08 by Tomo Nozawa
Connection Pooling in AR
前記事の補足です。
ActiveRecordは、現状データベースに対して1接続しかキャッシュできないようです。
そのため現状のJRoRでは、データソースを使ってもほぼ何の効果もない状況になっているようです。
それを改善すべく、Nick Siegerが取り組んでいるようで、ActiveRecord自体に手を入れ、Rails2.1のリリース後にRailsのtrunkにマージされるようです(まだ未定)。
Nickが行っているActiveRecordのコネクションプーリングの実装は、
- AR::Base.establish_connection が呼ばれると、コネクションプールオブジェクトが生成され、キャッシュされる。
- コネクションプールがそれぞれの接続を管理する
- Connection APIは大幅には変更しない
- JRoRから透過的にJNDIのデータソースを使えるようにする
詳細は、こちら。改良版ARのソースはこちら。
Connection Poolを有効に使えるRailsが登場するのはもう少しかかりそうですが、透過的にJRoRから使えるようになれば、大規模システム等でもRoRがより有効になるかもしれません。
2008/04/30 by Tomo Nozawa
