CentOS で PgPool の可能なすべての設定をセットアップした後、Java アプリケーションを使用してテストしたところ、機能していないことがわかりました。
インターネットでマニュアルを読んだ後 (ここにあります)、JDBC ステートメントが false に設定されていると (自動コミットの場合)、JDBC ステートメントが機能しないことがわかりました。
私は Hibernate を使用しているので、トランザクションを使用して値を設定していると確信しています。
私の質問は、これが本当なら、どの方法が私のデータベースを複製するのに役立つかということです. 並列モードと聞いていますが、Java アプリケーションで動作するかどうかはわかりません。誰かガイドしてサンプルを提供してもらえますか?
2 に答える
並列モードで意味するのがトランザクション分離レベルである場合、このページから、PostgreSQL が 4 レベルの分離をサポートし、プロパティを設定することで休止状態から構成可能であることがわかります:hibernate.connection.isolation
低い方から 1、2、4、または 8 にレベルを最高に。
Read commit は、PostgreSQL のデフォルトの分離レベルであり、ダーティ リードの 1 レベル上にあります。
シリアライゼーションは最高レベルであり、非常にコストがかかります。同じテーブルで 2 つのトランザクションが行われる場合、ロックが発生し、データベース/休止状態で設定されたタイムアウトを超えてロックが発生すると、ロックが発生するためです。タイムアウト例外をスローします。
それらについて聞いたことがあるかどうかはわかりませんが、パフォーマンスを向上させるために休止状態で使用できるフレームワークは次のとおりです。
構成が簡単で、OS に依存しません。私は PgPool の経験がないので、パフォーマンスの比較についてコメントすることはできません。
以下は、試してみたい休止状態の設定の例です。
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.connection.isolation">4</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</prop>
<prop key="net.sf.ehcache.configurationResourceName">WEB-INF/ehcache.xml</prop>
これが、データベース トランザクションに関してアプリケーションを最適化するのに役立つことを願っています。テーブルのインデックス作成や、プロファイラーを使用してどのトランザクションのコストが最も高いかを調べるなど、実際に確認できることは他にもたくさんあります。
ビジネスメソッドの最後の変更トランザクションは、説明したとおりに機能します。すべてコミットまたはロールバックされたすべての変更クエリを含む BEGIN/END ブロックが作成されます。
これは autocommit を false に設定することによって行われますが、これは Hibernate によって行われるすべてのクエリがこのモードで行われるという意味ではありません。必要な分離モードに応じて、同じクエリが自動コミット モードまたは非自動コミット モードのいずれかで実行される場合があります。
モードでのトランザクションの通常のケースでは、READ_COMMITED
ID による検索や名前付きクエリなどのクエリは、auto-commit true を使用して (したがって BEGIN/END ブロックなしで) 独自のデータベース トランザクションで実行されます。
ID による検索およびその他の読み取りクエリは、少なくともREPEATABLE_READ
分離モードで実行されている場合にのみ BEGIN ブロックをトリガーします。
これは、デフォルトのREPEATABLE_READ
分離モードを使用すると、ほとんどの選択クエリが in auto-commit = true で実行されるため、負荷分散が正常に機能することを意味します。
これは、たとえばlog4jdbcを使用して、データベースに送信されたすべての SQL クエリをログに記録することで確認できます。これにより、実際にデータベースに送信されたすべての SQL が出力されます。