いくつかのアプリケーションで並列に使用するmysqlデータベースを初めて作成する必要があります。この時点までは、mysqlデータベースに関する私の唯一の経験は、データベースに問い合わせる単一のプログラム(例えばWebサーバ)でした。 私は、いくつかのCXF javaサーブレットタイプのプログラムと、同じスキーマでの編集と読み取りを行うバックグラウンドサーバーを持つシナリオに移行しています。 Connector/J JDBCドライバを使用して、すべてのインスタンスでデータベースに接続しています。mysqlデータベースを並列に呼び出すときの注意
私の質問は次のとおりです。パラレルアクセスが問題にならないようにするためには何が必要ですか?私は適切な場所で取引を使用する必要があることを認識していますが、本当に失われているところは管理にあります。 たとえば、 サーブレットでジョブが完了するたびに接続を閉じる必要がありますか? データベースにアクセスするプログラムごとに一意のユーザーが必要ですか? Connector/Jオブジェクトで何かする必要がありますか? テーブルを別の方法で宣言する必要はありますか? 私は何かを見逃してしまったのですか、何か考えていませんでしたか? 私はトランザクションとSQL自体を処理する方法についてはかなり良い考えがありますが、データベースを設定するときに必要なことについてはかなり失われています。
もう1つの注意: 'MyISAM'ではなく' InnoDB'ストレージエンジンを使用してください。 InnoDBは並行処理(テーブルロックの代わりに行ロッキング)を扱う方がはるかに優れています。 –
接続プールの件名には、いくつかの質問があります。 1.それはすべてのサーブレット間で共有されることを意図しているのですか、それとも各自の接続プールを与えるのは公正でしょうか?理由は、確立されたユニットテストのほとんどがtomcatの外で実行され、私はそれらがtomcat固有のオブジェクトで作業しているのを見ていないからです。 2。私がここで読んだことから、主な関心事は、単一の接続オブジェクトに並行してアクセスすることを避けることだと仮定するのは正しいですか?複数の接続オブジェクトを同じデータベースユーザーに結ばせることは、永続的な接続を維持することと同様です。 –
1)接続自体は通常共有されません。プールは共有され、スレッドセーフです。プールの主な関心事は、データベース接続を作成するのにかかる時間です。はるかに簡単な解決策は、すべての要求に対して接続を作成することですが、応答時間の99%がその接続をネゴシエートします。接続の束を前もって交渉し、それらを再利用する方がはるかに効率的です。 2)私は接続は技術的にスレッドセーフであると信じていますが、トランザクションのcommit()が接続によって管理されるため、それらを複数のスレッドで共有することをお勧めしません。 – nsfyn55