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