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
Last-modified: 2010-10-19 (火) 21:21:36 (4937d)