[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 メーリングリストの案内