8

現在、Spring と Hibernate を使用するアプリケーションを拡張しています。アプリケーションが準備済みステートメントを介してデータベース (postgres) と通信するインスタンスが複数あります。これまでのアプリケーションは、dbcp 経由で postgres と通信していました。

変更: アプリケーションは、pgbouncer を介して postgres と通信するようになりました。

つまり、アプリケーション -> dbcp -> pgbouncer -> postgres

これが最も理想的な解決策ではないことは理解しています。つまり、2つのプーラーを持つことです。しかし、現在のアーキテクチャのため、両方が必要です。

要件: pgbouncer はトランザクションモードでのプリペアド ステートメントをサポートしていないため、削除する必要があります。

準備済みステートメントを削除するための変更。

1) psql: バージョン = 9.2.6

変化なし

2) pgbouncer: 構成ファイルで、次の属性を設定します。

  ignore_startup_parameters=extra_float_digits
  pool_mode=transaction
  server_reset_query=

3) jdbc : 準備されたしきい値は、それに応じて設定されています。すなわち:jdbc:postgresql://localhost:6541/postgres?prepareThreshold=0

 JAVA VERSION = 1.7.0_51

 JDBC DRIVER  = postgresql-9.3-1102.jdbc41-3.jar

4) dbcp : poolPreparedStatements = false maxOpenPreparedStatements = 0

5) 休止状態:変更なし

6) 春 :変更なし

問題:

これらすべての変更にもかかわらず、準備されたステートメントが作成されようとしており、そのためにトランザクションが失敗しているのをまだ見ています。

「エラー: 準備されたステートメント "S_21" は存在しません; ネストされた例外は org.postgresql.util.PSQLException: エラー: 準備されたステートメント "S_21 " は存在しません」

準備済みステートメントを使用したすべての論理変更を削除しました。

他の準備済みステートメントが作成されないようにするにはどうすればよいですか? spring または hibernate は、使用のために準備されたステートメントを内部的に作成しますか? はいの場合、それらを無効にするにはどうすればよいですか?

4

2 に答える 2

0

次の構成は、エラーなしで私のシステムで動作しています: 準備されたステートメント "S_21" は存在しません。エラー。それが役に立てば幸い:

  1. pgBouncer 1.6.1、pool_mode = トランザクション
  2. Hibernate db-connection 文字列に追加: prepareThreshold=0
  3. Postgresql-JDBC 9.4-1203-jdbc41 ドライバー
  4. Hibernate 4.x でプリペアド ステートメントを無効にする

    <property name="hibernate.cache.use_query_cache">false</property>
    
于 2015-10-14T08:49:09.490 に答える