[pgpool-general-jp: 317] Re: JDBC から pgpool-II を経由してのラージオブジェクトの読み込み

スクゥ 陶山 泰 suyama @ skoo.co.jp
2007年 12月 19日 (水) 13:49:29 JST


こんにちは。陶山です。

 現時点での状況を報告しておきます。
 ラージオブジェクトの読み出しはうまく動作するけれども、
 書き込みがうまくいかない。

陶山> Tatsuo> また,現在のPostgreSQLは(どのバージョンからか忘れましたが)この修正がコ
陶山> Tatsuo> ミットされており,pgpoolでうまくラージオブジェクトが扱えるようになって
陶山> Tatsuo> います。ただ,そのためには新しいラージオブジェクトのAPIを使う必要があ
陶山> Tatsuo> りますし,おそらくアプリケーション側でもそのAPIを使うように修正が必要
陶山> Tatsuo> になると思います。
陶山> 
陶山>  そうなのですか。
陶山>  PostgreSQL8 あたりでラージオブジェクトの扱いが大きく変わっていました
陶山> ので、たぶんそのあたりで変わったのでしょうね。
陶山> 
陶山> Tatsuo> このあたり,JDBCドライバ側での対応も必要になると思いますが,私は
陶山> Tatsuo> どうなっているのか分かりません。
陶山> 
陶山>  PostgreSQL8 からは、JDBC ドライバもアップデートしないと接続できません
陶山> でした。


 PostgreSQL 8.1.7
  JDBC 2      (jdk1.3を使っているので) 
 pgpool-II  2.0.1  Port 5432

 データは、PostgreSQL 7.2 のDBを dump し、pgpool 経由で restore
 $ pg_restore -p 5432 -d dbname /var/lib/postgresql/temp/backdata.tar 
 エラー(Index が作成できない)が出たものの、エラーとなったコマンドを全
てマニュアルで実行し、index を作成した
 

 クライアントPCから java アプリケーション(jdk1.3)で、pgpool に接続し、
絵や写真などのラージオブジェクトを読み出すことに成功しました。

 アプリケーションは、PostgreSQL7 対応から PostgreSQL8 対応にアップする
ために、若干の修正を施しました(ラージオブジェクト処理)。


 ここで、写真データ(jpg ファイル)をラージオブジェクトとして格納しよ
うとしてエラーが発生し、格納できませんでした。
 pgpool-II を経由しないで、直接一方だけの postgreSQL8.1.7 にラージオブ
ジェクトを格納することはできました。

 エラーメッセージは下記の通りです。
−− ここから −−−−−−−−−−−−−−−−−−−−−−−−−−−
org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.
Exception: java.io.EOFException
Stack Trace:
java.io.EOFException
        at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:257)
        at org.postgresql.core.v3.QueryExecutorImpl.receiveFastpathResult(QueryExecutorImpl.java:578)
        at org.postgresql.core.v3.QueryExecutorImpl.fastpathCall(QueryExecutorImpl.java:485)
        at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:74)
        at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:114)
        at org.postgresql.fastpath.Fastpath.getInteger(Fastpath.java:126)
        at org.postgresql.largeobject.LargeObject.<init>(LargeObject.java:91)
        at org.postgresql.largeobject.LargeObjectManager.open(LargeObjectManager.java:202)
        at PImporter.run(PImporter.java:92)
End of Stack Trace
−− ここまで −−−−−−−−−−−−−−−−−−−−−−−−−−−

PImporter.java は、私の書いたプログラムです。

<< PImporter.java の一部 >>
 LargeObjectManager lom = ((org.postgresql.PGConnection)db).getLargeObjectAPI();
  long oid = lom.createLO( LargeObjectManager.READ | LargeObjectManager.WRITE );
  LargeObject obj = lom.open( oid, LargeObjectManager.WRITE );    <<<< 92行目


 pgpool-II を経由せずに直接 postgresql 8.1.7 にラージオブジェクトを格
納することは可能だけれど、pgpool-II 2.0.1 を経由すると格納できないのは
なぜでしょうか。
 ラージオブジェクトの読み出しは、pgpool-II 2.0.1 経由でもうまく動作し
ています。


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