PostgreSQL JDBCドライバの問題

たまには技術系っぽいことでも。


PostgreSQLJDBCドライバでResultSet#getObjectメソッドを呼ぶと、たまにPGobjectそのものが返却され、目的の型(StringだとかTimestamp)にキャストしようとして失敗、ClassCastExceptionが発生する事があります。

これはPostgreSQL JDBCドライバのConnection実装クラスが保持する、DBMS-JDBC間の型マッピング情報(TypeInfoCache)の排他に絡む問題です。

具体的には、一部マッピング情報がstaticであるにも関わらず、Connectionクラス(というかTypeInfoCacheクラス)のコンストラクタ内で毎回初期化されており、しかも排他が不十分となっています。このため、初期化の間隙を縫ってgetObjectが呼ばれると、マッピング情報が存在しない、または一部欠落した状態に遭遇する場合があります。このときは変換対象のJDBC型を検出できず、PGobjectそのものが返却されます。


なお、この問題は Version 8.1-405 (2006-02-09) の版にて修正されました。

http://jdbc.postgresql.org/changes.html

The TypeInfoCache had a static Map for the pg type name to java.sql.Types conversion, 
but it was being reinitialized for each new Connection. 
Even though its content is static make this an instance variable
 for simplicity. (jurka) Thanks to Till Toenges.