IBM Support

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

Troubleshooting


Problem

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

Symptom

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

Cause

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

古い Jcc ドライバーには sun.io パッケージに依存したコードが含まれるため、症状に示したような例外が発生することがあります。
また、Java 8 に対応した Jcc ドライバーを使用している場合でも、Java 8 でコード変換ルールが厳格化されたために、従来は暗黙的に置換文字に置き換えられていたケースで CharConversionException などが返ることがあります。

Environment

a) 以下の条件を満たす場合、「サポートされない ccsid」エラーに遭遇する可能性があります。
  • 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 ファイルのフル・パスです。
b) データベースにコード・セットで定義されていない文字を含む場合、「CharConversionException」エラーが返ります。

Resolving The Problem

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

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

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

V10.5 および V11.1 のドライバーは DB2 V9.7 以降のサーバーへの接続をサポートしています。
詳細は以下の文書を参照してください。
[Db2] クライアント・サーバーのサポートされる組み合わせ
b) データベースの不正な文字の除去、または不正な文字の暗黙的な置換 
sun.io と java.nio は許容する文字の範囲が異なります。
たとえば、シフト JIS の置換文字である x'FCFC' はsun.io では許容され、暗黙的に Java の代替文字に置き換えられます。しかし java.nio では java.nio.charset.UnmappableCharacterException がスローされ、Jcc ドライバーは この例外を -4220 にマッピングします。
データベース上の正しくないコードを直ちに修正できない場合、Jcc の構成プロパティ db2.jcc.charsetDecoderEncoder=3 を設定することで、例外をスローせず暗黙的に代替文字に置き換えられます。
java -cp [class_path_to_the_application] -Ddb2.jcc.charsetDecoderEncoder=3 [appl_class_name]
不正な文字を特定するには、以下の Technote を参照してください。
JDBC アプリケーションが -4220 エラーで失敗する原因となったデータを特定する方法
注:2 バイト文字である GRAPHIC/VARGRAPHIC/DBCLOB 型に 1 バイト文字を格納した場合、db2.jcc.charsetDecoderEncoder で例外を回避できません。不正な文字を取り除いて例外を回避してください。
運用上の考慮点
  • 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
関連情報
[Db2] パスポート・アドバンテージによく寄せられる質問
[Db2] Db2 が提供している JDBC ドライバーの種類

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"10.5.0;11.1.0;11.5.0"}]

Document Information

Modified date:
16 August 2023

UID

swg22005262