2011-12-24
SQLFeatureNotSupportedException - JDBC4.0 API の中で未実装のもの
PostgreSQL Advent Calendar 2011 24日目の記事です。飛び入り参加しました。
この記事の主題はPostgreSQLのJava言語向けクライアントインタフェースである、JDBC Driverです。「今さらJavaですか?」という声も聞こえてきそうですが、まだまだ多くの場所で使われていると思うので、敢て取り上げたいと思います。
2011年、「今年の漢字」として「絆」が選ばれたこともあり、PostgreSQLとプログラムとの絆を実現するドライバの話題は今年に相応しい、ですよね?
JDBC4.0
JDBCとは、Java言語環境から各種データベースへ接続するためのAPIです。各データベース製品は、このJDBCの仕様に従ってドライバを実装して提供することにより、Javaプログラムから簡単に接続してもらうことが可能になります。
このJDBCのバージョン4.0は2006年11月に仕様が確定しています。これから約5年が経過していますが、PostgreSQLのJDBCドライバは >>Support for JDBC4 methods is not complete, but the majority of methods are implemented.<< (公式WebSiteより)という状態です。それでは具体的に何が未実装なのでしょうか?
未実装リスト
呼び出したJDBC APIが未実装であることを意味する例外 java.sql.SQLFeatureNotSupportedException を明示的に発生させているものの中から、よく使われそうなものをリストアップしてみました。「よく使われそうなもの」は筆者の独断と偏見です(笑)。
※調査対象は、version9.1 Build 901 JDBC Source
| JDBCのクラス/インタフェース名 | PostgreSQLでのクラス/インタフェース名 | メソッド | コメント |
|---|---|---|---|
| java.sql.Wrapper | org.postgresql.ds.jdbc4. AbstractJdbc4PoolingDataSource | isWrapperFor/unwrap | そのオブジェクトがラッパか否かを判定します。複雑な処理をやる時は使いそうですね。その他データソース系のクラスでも同様。 |
| java.sql.Blob | org.postgresql.jdbc4. AbstractJdbc4Blog | getBinaryStream(long, long) | 区間を指定してInputStreamを取得する動作は未実装のようです。BLOB全体をInputStreamで取得する操作は以前からサポートされています。CLOBについても同様。 |
| java.sql.Connection | org.postgresql.jdbc4. AbstractJdbc4Connection | createBlob() | 空っぽのBLOBを作成する機能です。CLOBやNCLOBについても同様。現状はlo_create関数などを使うしか無いということですかね。 |
| java.sql.Connection | org.postgresql.jdbc4. AbstractJdbc4Connection | getSchema() | JDK1.7より。現在のスキーマ名を取得する機能です。 |
| java.sql. ResultSet | org.postgresql.jdbc4. AbstractJdbc4ResultSet | updateBlob(int, InputStream) | 結果セット上のBLOBをInputStreamの内容で更新する機能です。CLOBやNCLOBについても同様。 |
| java.sql. PreparedStatement | org.postgresql.jdbc4. AbstractJdbc4Statement | setRowId | PreparedStatementでのinsert/updateでRowIdをセットするための機能です。Javaで言うRowIdはPostgreSQLのoidのようなものでしょうか。oidをクライアント側で決定/変更するのは無理だったと思います。JDBCもそれに倣った形ですね。 |
| java.sql. PreparedStatement | org.postgresql.jdbc4. AbstractJdbc4Statement | setBinaryStream | PreparedStatementでのinsert/update1文でBLOBをセットするための機能です。CLOBやNCLOBについても同様。 |
ざっと、こんなところでしょうか。ラージオブジェクトを楽に使うために追加されたAPIは未実装が多いという印象です。また、当然ながら他にもいろいろあります。利用する際は気をつけたいものです。時間があれば実装にも挑戦してみたいなぁ等とも思います。
ついでに
いろいろ実験やってて思ったのですが、JDBC Driver が出力するエラーメッセージって、機械翻訳っぽい日本語が多いですよね。前述の未実装部分の実装と共に、より日本語っぽい表現に書き換えたいところです。日本国内でのPostgreSQL普及促進のためには、こちらの方が優先度が高いのかもしれません。
参考情報へのリンク
- PostgreSQL JDBC Driver 公式WebSite http://jdbc.postgresql.org/
- PostgreSQL JDBC Driver Mailing List Archive http://archives.postgresql.org/pgsql-jdbc/
- JDBC4.0 仕様(JSR221) http://jcp.org/aboutJava/communityprocess/final/jsr221/index.html
最後に
最終日:25日目を書いて下さる方、現時点でも募集中です。お早めに!
- 11 http://atnd.org/events/21994
- 2 http://mixi.jp/view_diary.pl?url=http://d.hatena.ne.jp/t_motooka/20111224/1324710925&owner_id=6694036
- 1 http://d.hatena.ne.jp/t_motooka
- 1 http://k.hatena.ne.jp/keywordblog/API?mode=rss
- 1 http://www.btr8for.com/
- 1 http://www.google.co.jp/url?sa=t&rct=j&q=イエデンワ 分解&source=web&cd=7&ved=0CEMQFjAG&url=http://d.hatena.ne.jp/t_motooka/20111105&ei=Een1TrzUIu-5iAf83MW2AQ&usg=AFQjCNGlix5oUCdzxf9aztjEv-
- 1 http://www.google.co.jp/url?sa=t&rct=j&q=ios developer program 職業&source=web&cd=4&ved=0CDwQFjAD&url=http://d.hatena.ne.jp/t_motooka/20110721/1311236787&ei=qtX1TvTJFKPImQWE5qiFAg&usg=AFQjCNEayLDS-iWfnefmVdUwfs5EzQRPRw&sig2
- 1 http://www.google.co.jp/url?sa=t&rct=j&q=mac book proで使える icレコーダー&source=web&cd=6&ved=0CF8QFjAF&url=http://d.hatena.ne.jp/t_motooka/20110730&ei=WzP3TuqJK7HGmQWOs
- 1 http://www.google.co.jp/url?sa=t&rct=j&q=thread runnable 速度&source=web&cd=2&ved=0CC0QFjAB&url=http://d.hatena.ne.jp/t_motooka/20111212/1323703909&ei=KQv2Tp-XI-KSiAenvMzMAQ&usg=AFQjCNEDCVCsVn43QnbBOyIMS1cxtWV7Ug&sig2=fCLGBZt
