IBM Support

[Db2] Java 8 に移行すると、JDBC アプリケーションがエラー -4220 で失敗することがある

Technote(トラブルシューティング)


問題(概要)

Java アプリケーション・サーバーのアップグレードなどで、Java 8 にアップグレードした場合、これまで正常に動作していた JDBC アプリケーションが -4220 エラーをスローするようになることがあります。

症状

Unicode でないデータベースに接続した場合や、文字操作を行った場合に以下のような例外がスローされることがあります。

com.ibm.db2.jcc.am.SqlDataException:
[jcc][t4][10275][10041][3.68.61] サポートされない ccsid、エンコード、またはロケール: "Cp943C"。
ERRORCODE=-4220, SQLSTATE=22021
(コンバーター名は接続先 DB に依存して可変です。)

[jcc][t4][1065][12306][3.64.82] java.io.CharConversionException をキャッチしました。  詳しくは、添付の Throwable を参照してください。
ERRORCODE=-4220, SQLSTATE=null


原因

Java 8 で sun.io パッケージは廃止されました。

古い Jcc ドライバーには sun.io パッケージに依存したコードが含まれるため、症状に示したような例外が発生することがあります。


環境

以下の条件を満たす場合、この問題に遭遇する可能性があります。

  • Jcc 3.69.49 または Jcc 4.19.49 より古い Jcc ドライバーを使っている。

現在利用中の Jcc ドライバーのバージョンは、以下のコマンドで確認できます。
java -cp <path_to_db2jcc.jar> com.ibm.db2.jcc.DB2Jcc -version

注: path_to_db2jcc.jar はお使いの db2jcc.jar または db2jcc4.jar ファイルのフル・パスです。


解決方法

Db2 V10.5 FP7 以降に含まれる Jcc ドライバーは Java 8 に対応しています。

Db2 V10.5 FP7 以降、もしくは Db2 V11.1 に含まれる Jcc ドライバーにアップグレードしてください。


V10.5 JDBC および SQLJ のサポートの機能拡張

    FP7: Java 8 ランタイム環境との互換性
    IBM Data Server Driver for JDBC and SQLJ は、Java 8 Runtime Environment と互換性を持つようになりました。 修正された Java 8 との既知の互換性の問題については、IBM Data Server Driver for JDBC and SQLJ フィックスパック 7 APAR を参照してください。
IT12454: Java 8 compatibility
    The UTF-8 rules in Java 8 have been made stricter and some character encoding sequences that were considered valid until Java 7, may fail with the java.nio.charset.MalformedInputException with Java 8.

V11.1 DB2 データベース製品の Java ソフトウェア・サポート

Jcc ドライバー・ファイルは以下のページから入手可能です。
DB2 JDBC Driver Versions and Downloads

V10.5 および V11.1 のドライバーは DB2 V9.7 以降のサーバーへの接続をサポートしています。
詳細は以下の文書を参照してください。
[DB2 LUW] クライアント・サーバーのサポートされる組み合わせ


運用上の考慮点
Jcc ドライバーの db2.jcc.charsetDecoderEncoder 構成プロパティを利用して、sun.io でなく java.nio パッケージの使用を強制できます。しかし、Java 8 に対応していないドライバーで、この構成プロパティを設定してエラーを回避する運用はサポートされないのでご注意ください。

Java 8 をサポートするドライバーで、Unicode データベースに接続しているときに -4220 (java.nio.charset.MalformedInputException) エラーが返されることがあります。これは Java 8 で UTF-8 データの処理が厳格化された影響の可能性があるため、以下の Technote を参照してください。
UTF-8 encoding/decoding problem in JDK 8

sun.io と java.nio は許容する文字の範囲が異なります。
たとえば、シフト JIS の置換文字である x'FCFC' はsun.io では許容され、暗黙的に Java の代替文字に置き換えられます。しかし java.nio では java.nio.charset.UnmappableCharacterException がスローされ、Jcc ドライバーは この例外を -4220 にマッピングします。
データベース上の正しくないコードを直ちに修正できない場合、Jcc の構成プロパティ db2.jcc.charsetDecoderEncoder=3 を設定することで、例外をスローせず暗黙的に代替文字に置き換えられます。

WebSphere Application Server の Software Compatibility Product Report (SCPR) が正しくない情報をレポートすることがあるのでご注意ください。

関連情報
[DB2 LUW] パスポート・アドバンテージによく寄せられる質問
[DB2 LUW] DB2 が提供している JDBC ドライバーの種類

お問合せ先
技術的な内容に関して、サービス契約のもと IBM サービス・ラインにお問い合わせください。
IBM サービス・ライン

Document information

More support for: DB2 for Linux, UNIX and Windows
Programming Interface - JCC

Software version: 10.5, 11.1

Operating system(s): AIX, HP-UX, Linux, Solaris, Windows

Reference #: 2005262

Modified date: 06 July 2017