Jboss AS 7 コンテナーで実行されている Web ソフトウェアは、JTA に委任された構成である JPA を介して PostgreSQL 9.1 データベースにデータを保存します。
昨年、AWS EC2 クラウドで実行できるようになりました。ユーザーの需要が高まるにつれて、データベースの使用量も増加しました。予想通り、ラッシュ時にデータベース サーバーがビジー状態になり、ユーザーの使用経験に影響を与えました。
PostgreSQL に関するいくつかのレプリケーション調査の後、PGPool2 が私たちの場合に適したレプリケーション ソリューションになる可能性があることに気付きました。これは、SELECT クエリのロード バランシングと、CUD 操作 (UPDATE、INSERT、DELETE) のレプリケーションも提供します。
これまでのところ、ソフトウェアが遅くなることを除けば、とても良いです。実際、PGPool2 のドキュメントで明示されているように、明示的な BEGIN/END トランザクションで定義されている場合、SELECT クエリは負荷分散されません。
クエリを負荷分散するには、次のすべての要件を満たす必要があります。 - PostgreSQL バージョン 7.4 以降 - クエリは、明示的に宣言されたトランザクション内にあってはなりません (つまり、BEGIN ~ END ブロック内にあってはなりません)。 - SELECT nextval または SELECT setval ではない - SELECT INTO ではありません - SELECT FOR UPDATE でも FOR SHARE でもありません - 「SELECT」または COPY TO STDOUT、EXPLAIN、EXPLAIN ANALYZE SELECT のいずれかで始まります... - ignore_leading_white_space = true は先頭の空白を無視します。
2 つの質問:
- 明示的なトランザクションで実行されていた SELECT クエリを特定するにはどうすればよいでしょうか?
- _javax.ejb.TransactionAttributeType.NOT_SUPPORTED_ はトランザクション スコープを修正し、SELECT メソッドが「トランザクション フリー」として実行されることを許可しますか?