[pgpool-general-jp: 318] Re: JDBC から pgpool-II を経由してのラージオブジェクトの読み込み
Tatsuo Ishii
ishii @ sraoss.co.jp
2007年 12月 19日 (水) 15:17:21 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 経由でもうまく動作し
> ています。
Javaのことはよくわからないのですが,
> long oid = lom.createLO( LargeObjectManager.READ | LargeObjectManager.WRITE );
PostgreSQLのラージオブジェクト新APIでは,作成時にラージオブジェクトの
IDを明示的に与えることになっています。ところがこのコーディングでは,ID
を明示的に与えておらず,PostgreSQLまかせでOIDを生成しているので,うま
くいかないのだと思います。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgpool-general-jp メーリングリストの案内