[pgpool-general-jp: 22] Re: JDBCからpgpool-IIを経由してのpostgreSQL接続について

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2006年 11月 9日 (木) 18:22:27 JST


浅羽です。

From: 高橋 浩之 <hiroyuki.takahashi @ ulsystems.co.jp>
Subject: [pgpool-general-jp: 19] JDBCからpgpool-IIを経由してのpostgreSQL接続について
Date: Thu, 09 Nov 2006 16:48:44 +0900

> javaアプリケーションで、JDBC→pgpool-II→postgreSQLという経路のDBアクセ
> スを実現したいのですが、うまく行かず、ご相談させていただきたくメール投稿
> いたしました。
> 
> ・postgresql-8.1-406.jdbc3.jar
> ・pgpool-II 1.0.1
> ・postgreSQL8.1.4
> 
> pgpool-IIに同梱されたHTMLドキュメントに以下の記述があります。
> 
> > 拡張問い合わせプロトコル
> > 
> > 制限対象:パラレルモード
> > 
> > JDBC ドライバなどのような拡張問い合わせプロトコルには対応していません。
> > 必ず簡易問い合わせプロトコルを使用してください。 
> 
> この記述は、pgpool.confの以下のフラグをtrueにしない限り、JDBC接続が可能
> である、と理解したのですが、正しいでしょうか?

はい、正しいです。

> 
>  parallel_mode = false
> 
> その上で、今の状況としては、
> 
> (1)【成功】psql→pgpool-II→postgreSQL
> (2)【成功】pgAdminIII→pgpool-II→postgreSQL
> (3)【成功】java(JDBC)→postgreSQL
> (4)【失敗】java(JDBC)→pgpool-II→postgreSQL
> 
> という感じです。
> 
> 比較の為、上の(3)と(4)のpostgreSQLのログを最後に添付します。
> 
> (3)の失敗ケースは、添付したログを吐いた状態でjavaアプリ側に制御が戻って
> きません。

手元の環境でも再現しました。簡単にテストしてみた感じでは通っているので
すが、添付のパッチでいかがでしょうか? configure のあるディレクトリに
コピーして

  % patch -p0 < pool_process_query.c.patch

と実行してください。

なお、pgpool-II で拡張問い合わせを負荷分散させるようにパッチを作成して
いるのですが、なかなか時間が取れないので、もう少しお待ちください。

--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp
-------------- next part --------------
Index: pool_process_query.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_process_query.c,v
retrieving revision 1.4
diff -c -r1.4 pool_process_query.c
*** pool_process_query.c	27 Sep 2006 02:14:24 -0000	1.4
--- pool_process_query.c	9 Nov 2006 09:14:27 -0000
***************
*** 314,328 ****
  				status = read_kind_from_backend(frontend, backend, &kind);
  				if (status != POOL_CONTINUE)
  					return status;
  
- 				if (kind != 0 || kind1 != 0)
- 				{
- 					pool_debug("cached kind(%02x) or kind1(%02x) != 0", kind, kind1);
- 				}
- 				else
- 				{
- 					continue;
- 				}
  			}
  		}
  
--- 314,329 ----
  				status = read_kind_from_backend(frontend, backend, &kind);
  				if (status != POOL_CONTINUE)
  					return status;
+ 			}
+ 
+ 			if (frontend->len > 0)
+ 			{
+ 				status = ProcessFrontendResponse(frontend, backend);
+ 				if (status != POOL_CONTINUE)
+ 					return status;
+ 
+ 				continue;
  
  			}
  		}
  


pgpool-general-jp メーリングリストの案内