2012-08-16 28 views
6

Rubyを使い始めましたが、Sinatraで遊んでいますが、リクエスト間でデータベース接続を共有する方法が見つかりませんでした。ルビーのデータベース接続プーリング

私はJava Web開発から来て、あなたがしなければならない基本的なことの1つは、データベース接続をプールすることです。だから、Rubyに類似のものが存在すると確信しています。

ActiveRecordとDataMapperがこの機能を提供しますが、ORMは必要なく、通常のSQLクエリを作成したいだけです。

Sinatraにはいくつかのアプローチがありますか、またはすべてのRackベースのアプリケーションに一般的な方法がありますか?

答えて

4

接続を永続化するには、インスタンス変数(Sinatraアプリケーションは単にオブジェクトです)またはグローバル変数のみを作成する必要があります。またはあなたのための接続を管理するクラス。私が見たほとんどのRubyデータベースライブラリは、データベースアダプタかクライアントだけです。

@db = Mysql2::Client.new #... 

またはグローバル変数:

$db = Mysql2::Client.new #... 

接続プーリングアプリケーションの寿命のために複数のスレッド/繊維間の接続の数が少ないを共有するだけの方法です。私が知る限り、JVMであるJavaはプロセス間の接続を共有しません。

ただし、一般的な目的はConnection Pool library for Rubyです。

+0

申し訳ありませんが、インスタンス変数を作成した場合は、アプリケーションオブジェクトが作成されるたびに新しい接続も作成されます。 どうやって接続を共有するのか? – Nikoi

+1

アプリケーションを手動で閉じるまで、アプリケーションは要求間で閉じられません。アプリケーションはロードされ、要求に応答し、その存続期間にわたって接続を維持します。それは私がRubyの接続プーリングについて知っている最高のものです。 –

+1

[Sequel](http://sequel.rubyforge.org)、[DataMapper](http://datamapper.org)、または[ActiveRecord](http://)のようなORMなしで直接Mysql2を使用することは、 rubygems.org/gems/activerecord)。ほとんどの場合、これらは自動的にプールされます。あなたが "単にSQLクエリを実行している"場合、アプリケーションはすぐに混乱を招くでしょう。 Sequelは、クエリージェネレータが実際にはかなり良いので実際にそこに行かずにSQLに近づくための最良の選択です。 – tadman

関連する問題