2

データベーステーブルを複数のサーバーに分割するために、並列モードでpgpool 3.2.1を使用しようとしています。ただし、Java を使用する場合は、レプリケーション モードのみを実行し、並列モードは実行しないようです。

テストでは、Postgres 8.3 を実行する 3 つのバックエンド サーバーと、分散するテーブルに 300 行のテスト データベースを使用しています。

SQL ステートメントを使用して (つまり、psql シェルから) データベースを作成してクエリを実行すると、すべてが正常に機能しているように見えます。システム サーバーにクエリを実行すると 300 行が表示され、3 つのバックエンド サーバーにクエリを実行すると、それぞれに 100 行があることが示されます。

ただし、Java アプリケーションから同じデータベースを作成すると、挿入が分散ではなく複製されるため、各バックエンド サーバーには 300 行すべてが含まれます。Java でシステム サーバーにクエリを実行すると、正しく 300 行が表示されますが、psql でシステム サーバーにクエリを実行すると、結果が結合されて 900 行が表示されます。

Java では並列モードが無視され、代わりにレプリケーション モードが使用されているようです。これに関する pgpool ログには何も出力されていないようで、データがバックエンド サーバー間で分散されていないことを除いて、Java でエラーは発生しません。

pgpool のマニュアルに次の制限が記載されています。 http://pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-en.html#restriction

Extended Query Protocol (並列モード用)

JDBC ドライバなどで使用されている拡張クエリ プロトコルはサポートされていません。シンプル クエリ プロトコルを使用する必要があります。これは、準備済みステートメントを使用できないことを意味します。

Java プログラムは準備済みステートメントを使用しており、準備済みステートメントを使用しないという選択肢はないかもしれません。

pgpoolとプリペアド ステートメントに関する同様の質問があります 。PGPool II に対する Java クエリにより、「名前のないプリペアド ステートメントが存在しません」というエラーが発生する

しかし、protocolVersion=2 を JDBC URL に追加すると、Java の挿入ステートメントが終了しなくなります。

誰もこの問題を経験しましたか? 可能な回避策はありますか?

ありがとう

4

1 に答える 1

1

私も同じ問題を抱えてる。JDBC ドライバーの代わりに libpq C ライブラリーを使用して回避しようとしています。

SWIG/JNI を使用して Java で C ライブラリのラッパーを作成したところ、正しく動作しているようです。

私のブログのこの投稿で、私の実験の結果を見ることができます。

あなたの場合に同じ解決策が適用できるかどうかはわかりません。パーティション化する (そして分離された) テーブルはほとんどないので、これらの特定の状況では licpq ラッパーを使用します。アプリケーションの他の部分については、引き続き JDBC ドライバーを使用し、単一の PostgreSQL バックエンドに (PGPool 経由ではなく) 直接接続します。

于 2013-02-04T17:34:03.200 に答える