[[FrontPage]]
**TomcatでLargeObjectを利用する方法
PostgreSQLでLargeObjectを扱うためには、PostgreSQLのConnectionオブジェ
クトを取得する必要がある。Tomcatからデータソースを利用した場合、
Commons DBCPでコネクションがラッピングされているため、Commons DBCPの
ConnectionオブジェクトからPostgreSQLのコネクションオブジェクトを取得す
る必要がある。また、DBCPはデフォルトでは、データベースネイティブのコネ
クションを取得することができないので、データベースネイティブのコネクショ
ンを取得できるように設定する必要がある。

JDBCネイティブのコネクションを取得する設定

 <Resource 
   ...
   accessToUnderlyingConnectionAllowed="true"
   factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
   ...
  />

Tomcat5.0では、org.apache.commons.dbcp.BasicDataSourceFactoryであるが、
Tomcat5.5からは、Commons DBCPをTomcat固有に名前を変えているため、上記
のようにorg.apache.tomcat.dbcp.dbcp.BasicDataSourceFactoryと指定する。


上記の設定を行った上で、PostgreSQLのコネクションオブジェクトを取得するには次のようにする。

 Context ctx = new InitialContext();
 DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MyDataSource");
 Connection conn = ds.getConnection();
 
Connection pgCon = 
    ((org.apache.tomcat.dbcp.dbcp.DelegatingConnection)con).getInnermostDelegate();
 LargeObjectManager lom =
    ((PGConnection)pgCon).getLargeObjectAPI();

Tomcat上で取得したコネクションの実装はDelegatingConnectionとなっている
ため、DelegatingConnectionにキャストしgetInnermostDelegateメソッドでDB
ネイティブなコネクションを取得する。

**PostgreSQL8.0のJDBCドライバを7.4.x互換モードで動作させる
PostgreSQL8.0からは、PreparedStatementでテーブルのカラムの型と異なるメソッドで値を入出力しようとするとExceptionが発生する。また、テーブル名が大文字で返却したり、小文字で返却したりと微妙に動作が異なる。パラメータのprotocolVersionを2に設定するとPostgreSQL7.4.xと同じ動作をするようになる。
 jdbc:postgresql://localhost/testdb?protocolVersion=2

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS