2012-04-25 9 views
0

いくつかのアプリケーションで並列に使用するmysqlデータベースを初めて作成する必要があります。この時点までは、mysqlデータベースに関する私の唯一の経験は、データベースに問い合わせる単一のプログラム(例えばWebサーバ)でした。 私は、いくつかのCXF javaサーブレットタイプのプログラムと、同じスキーマでの編集と読み取りを行うバックグラウンドサーバーを持つシナリオに移行しています。 Connector/J JDBCドライバを使用して、すべてのインスタンスでデータベースに接続しています。mysqlデータベースを並列に呼び出すときの注意

私の質問は次のとおりです。パラレルアクセスが問題にならないようにするためには何が必要ですか?私は適切な場所で取引を使用する必要があることを認識していますが、本当に失われているところは管理にあります。 たとえば、 サーブレットでジョブが完了するたびに接続を閉じる必要がありますか? データベースにアクセスするプログラムごとに一意のユーザーが必要ですか? Connector/Jオブジェクトで何かする必要がありますか? テーブルを別の方法で宣言する必要はありますか? 私は何かを見逃してしまったのですか、何か考えていませんでしたか? 私はトランザクションとSQL自体を処理する方法についてはかなり良い考えがありますが、データベースを設定するときに必要なことについてはかなり失われています。

答えて

2

接続のプールを維持する必要があります。接続は数百ミリ秒のオーダーで考えるのは本当に高価です。大容量のアプリケーションでは、キャッシュして再利用するのが理にかなっています。

サーブレットについては、使用しているコンテナによって異なります。 JBossのようなものは、コンテナの一部としてプールを提供します。これは、データソース定義を通じて定義され、JNDIを通じてアクセスされます。 tomcatのような他のコンテナは、C3POのようなものに依存するかもしれません。

これらのフレームワークのほとんどは、プールへの接続を返すロジックを持つclose()メソッドを実装するJDBC接続のカスタム実装を返します。

並行性の考慮事項については、楽観的/悲観的なロックとトランザクション分離レベルの概念を理解しておく必要があります。これらはトレードオフがあり、正しい答えはアプリケーションの操作上のコンテキストでのみ決定できます。

ほとんどのアプリケーションには、読み取り/書き込みユーザーと呼ばれるアプリケーションを表す1人のユーザーがいます。このユーザーは、アプリケーションに関連付けられているテーブル、インデックス、シーケンスなどからレコードを読み書きする権限しか持たないようにしてください。アプリケーションのすべてのインスタンスは、接続文字列でこのユーザーを指定します。

あなたは上記の概念を理解した場合、あなたはそこに道の約95%になるだろう。

もう1つ。管理サイドのコメントで指摘されているように、データベースエンジンは大きな検討事項です。相違点とチューニング/構成オプションについて理解しておく必要があります。

+1

もう1つの注意: 'MyISAM'ではなく' InnoDB'ストレージエンジンを使用してください。 InnoDBは並行処理(テーブルロックの代わりに行ロッキング)を扱う方がはるかに優れています。 –

+0

接続プールの件名には、いくつかの質問があります。 1.それはすべてのサーブレット間で共有されることを意図しているのですか、それとも各自の接続プールを与えるのは公正でしょうか?理由は、確立されたユニットテストのほとんどがtomcatの外で実行され、私はそれらがtomcat固有のオブジェクトで作業しているのを見ていないからです。 2。私がここで読んだことから、主な関心事は、単一の接続オブジェクトに並行してアクセスすることを避けることだと仮定するのは正しいですか?複数の接続オブジェクトを同じデータベースユーザーに結ばせることは、永続的な接続を維持することと同様です。 –

+0

1)接続自体は通常共有されません。プールは共有され、スレッドセーフです。プールの主な関心事は、データベース接続を作成するのにかかる時間です。はるかに簡単な解決策は、すべての要求に対して接続を作成することですが、応答時間の99%がその接続をネゴシエートします。接続の束を前もって交渉し、それらを再利用する方がはるかに効率的です。 2)私は接続は技術的にスレッドセーフであると信じていますが、トランザクションのcommit()が接続によって管理されるため、それらを複数のスレッドで共有することをお勧めしません。 – nsfyn55

関連する問題