概要

この章では、Javaデータベース接続(JDBC)、Teradata JDBC Driver、クライアント システムのJavaプログラムをデータベースに接続する2階層アーキテクチャについて説明します。この章は、以下のセクションで構成されています。

新機能

Teradata JDBC Driverバージョン20.0の新機能

Teradata JDBC Driverバージョン17.20の新機能

Teradata JDBC Driverバージョン17.10の新機能

Teradata JDBC Driverバージョン17.0の新機能

Teradata JDBC Driverバージョン16.20の新機能

Teradata JDBC Driverバージョン16.10の新機能

Teradata JDBC Driverバージョン16.0の新機能

Teradata JDBC Driverバージョン15.10の新機能

Teradata JDBC Driverバージョン15.0の新機能

Teradata JDBC Driverバージョン14.10の新機能

Teradata JDBC Driverバージョン14.0の新機能

Teradata JDBC Driverバージョン13.10の新機能

Teradata JDBC Driverバージョン13.0の新機能

Teradata JDBC Driverバージョン12.0の新機能

ソフトウェア アップグレードの計画

リストされているJDBC仕様機能と動作のサポートを見越して、これらのJDBC仕様機能と動作に対応するようにアプリケーションを変更する必要があります。JDBC 3.0仕様では、executeQuery、executeUpdate、およびexecuteBatchの各APIに渡すSQLリクエストを妥当性検査するためにJDBCドライバとデータ ソースが必要です。また、SQLリクエストがAPIに不適切な場合、executeQuery、executeUpdate、およびexecuteBatchの各APIからSQLExceptionをスローする必要があります。

Teradata JDBC Driverの現在のバージョンを特定する手順

Windows

Windowsに現在インストールされているTeradata JDBC Driverのバージョンを特定するためには、コマンド プロンプト ウィンドウを開いて、Teradata JDBC Driverが格納されているディレクトリに移動した後、次のコマンドを使用します。

jar xvf terajdbc4.jar META-INF/MANIFEST.MF

type META-INF\MANIFEST.MF

UNIXおよびLinux

UNIXおよびLinuxに現在インストールされているTeradata JDBC Driverのバージョンを特定するためには、Teradata JDBC Driverが格納されているディレクトリに移動した後、次のコマンドを使用します。

jar xvf terajdbc4.jar META-INF/MANIFEST.MF

cat META-INF/MANIFEST.MF

JDBCインターフェースの説明

JDBCは、アプリケーション プログラミング インターフェース(API)の仕様です。このAPIにより、プラットフォームに依存しないJavaアプリケーションは、SQLを使用してデータベース管理システムにアクセスできます。

JDBC APIは、次の項目に関するインターフェースの標準セットを提供しています。

これらのインターフェースを図1 表2 に示します。

図1: JDBCインターフェース

表2: JDBCインターフェース

インターフェース名

説明

java.sql.Blob

バイナリ ラージ オブジェクト(BLOB)のサポートを提供する。

java.sql.Clob

文字ラージ オブジェクト(CLOB)のサポートを提供する。

java.sql.Connection

データベースへの接続を表わす。

java.sql.DatabaseMetaData

選択したデータベースに関するさまざまな情報にアクセスする。

javax.sql.DataSource

データベース接続の作成や取得のサポートを提供する。

java.sql.DriverManager

ドライバをロードして、データベース接続の新規作成をサポートする。

java.sql.ParameterMetaData

パラメータのメタデータ情報にアクセスする。

java.sql.PreparedStatement

特定の接続上でプリペアードSQL文を実行するためのコンテナとして動作する。

java.sql.ResultSet

与えられた文の結果行へのアクセスを制御する。

java.sql.ResultSetMetaData

結果セットのメタデータ情報にアクセスする。

java.sql.Statement

指定の接続上でSQL文を実行するためのコンテナとして動作する。

Java.sql.CallableStatement

指定の接続に対してデータベース上でストアド プロシージャを実行するためのコンテナとして動作する。

javax.sql.ConnectionEventListener

PooledConnectionにより生成されたイベントを受信するよう登録するオブジェクトとして動作する。

javax.sql.ConnectionPoolDataSource

PooledConnectionオブジェクト用のファクトリーです。このインターフェースを実装するオブジェクトは、一般にJava Naming and Directory Interface (JNDI)サービスによって登録されます。

javax.sql.PooledConnection

接続プール管理用のフックを提供する接続オブジェクトです。PooledConnectionオブジェクトは、データ ソースへの物理的接続を表わします。

Teradata JDBC Driverの説明

Teradata JDBC Driverは、JDBCインターフェースを使用するJavaクラスのセットです。そのため、Java言語を使用してTeradata Vantage™にアクセスできます。図2 に表示されているように、Teradataは現在、Type 4のJDBCドライバに対応しています。

図2: JDBCインターフェース

Type 4 JDBCドライバ

Type 4 JDBCドライバはデータベースと直接通信します。

JDBC Type 4アーキテクチャ

説明

Teradata JDBC Driverは、図3 に示すように、2階層のアーキテクチャを使用してデータベースにアクセスします。

図3: JDBC Type 4アーキテクチャ

動作の概要

Teradata JDBC Driverはプラットフォームに依存しないため、サポートされているJava仮想マシン(JVM)がインストールされているすべてのシステムで使用できます。

Teradata JDBC DriverのJavaクラスは、TCPソケットを使用してデータベースに直接接続されます。

利点

2階層のアクセス アーキテクチャには、次の利点があります。

多国語機能のサポート

Java仮想マシン ロケール

Teradata JDBC Driverは、日本語ロケールをサポートしています。この結果、JVMに日本語ロケールが使用されている場合、Teradata JDBC Driver例外メッセージ テキストは日本語で表示されます。

java -Duser.language=ja -Duser.country=JP

これは、Teradata JDBC Driverの例外条件にだけ適用されます。データベースのエラー条件の例外メッセージ テキストは、データベースにより表示されるため、JVMロケールで制御されません。

日本語ロケール以外のすべてのロケールでは、Teradata JDBC Driver例外のメッセージ テキストは英語で表示されます。

JavaアプリケーションからTeradata JDBC Driverへのデータの流れ

JDBC APIを含むほとんどすべてのJava APIで、java.lang.Stringオブジェクトの使用が想定されています。このオブジェクトには、Unicode文字が入っています。

文字データは、通常、java.lang.StringオブジェクトとしてJavaアプリケーションからTeradata JDBC Driverに渡されます。これはアプリケーションが以下の場合に起こります。

Teradata JDBC Driverにjava.lang.Stringオブジェクトとしてデータが渡されると、Teradata JDBC Driverは非UnicodeからUnicode文字への変換を実行しません。これは、java.lang.Stringオブジェクトには必ずUnicode文字が入っているからです。

Javaアプリケーションが非Unicode文字を取得し、これらの文字をデータベースに格納する、例外的なシナリオが2つあります。これらは、一般的なアプリケーション開発シナリオではありません。というのは、一般的なJavaアプリケーションはもっぱらUnicodeベースで開発されるからです。

シナリオ1では、非Unicode文字列データがJavaバイト配列にバイト形式で格納されている状態で、Javaアプリケーションは、次のjava.lang.Stringコンストラクタを使用します。 

String(byte[] bytes, String charsetName) 

この結果、指定した文字セットを使用して指定したバイト配列をデコードした、新しいStringが作成されます。java.lang.Stringオブジェクトを作成したら、JavaアプリケーションはほかのJava Stringオブジェクトと同じようにこのオブジェクトを操作できます。また、Teradata JDBC Driverにこのオブジェクトを渡すことができます。

シナリオ2では、非Unicode文字列データがファイル システム上のファイルに格納されている状態で、Javaアプリケーションは、ファイルからの入力データを表わす? (疑問符)パラメータ マーカーの付いたPreparedStatementオブジェクトを使用します。このとき、Javaアプリケーションは、次のJDBC APIのどれかを使用します。

Teradata JDBC Driverとデータベース間のデータフロー

Teradata JDBC Driverは、Javaアプリケーションがデータベース セッションに対してセッション文字セットを指定できるように、CHARSET接続パラメータを提供します。CHARSET接続パラメータについての説明は、「Teradata JDBC Driverの使用」に記載の「データベース接続パラメータ」の表を参照してください。JavaアプリケーションがCHARSET接続パラメータを指定しない場合、デフォルト設定のCHARSET=ASCIIが使用されます。

推奨は、Javaアプリケーションが、データベースのUnicode列に文字データを格納し、UTF8セッション文字セット(接続パラメータCHARSET=UTF8)を使用することです。この結果、文字セット間の変換を回避できるため、文字データのエンドツーエンドの忠実性を保証できます。

Teradata JDBC Driverは、表3 で示しているように、Teradataセッション文字セットからJava文字セットへの固定マッピングを提供します。特定のTeradataセッション文字セットに対して、対応するJava文字セットを使用して、データベースに送信するバイトをエンコードし、データベースから受信したバイトをデコードします。

表3: 文字セット マッピング 

Teradataセッション文字セット

Java文字セット

ASCII

ASCII

UTF8

UTF8

UTF16

UnicodeBigUnmarked

EBCDIC037_0E

Cp037

EBCDIC273_0E

Cp273

EBCDIC277_0E

Cp277

HANGULEBCDIC933_1II

Cp933

HANGULKSC5601_2R4

MS949

KANJIEBCDIC5026_0I

Cp930

KANJIEBCDIC5035_0I

Cp939

KANJIEUC_0U

EUC_JP

KANJISJIS_0S

MS932

LATIN1_0A

ISO8859_1

LATIN1252_0A

Cp1252

LATIN9_0A

ISO8859_15_FDIS

SCHEBCDIC935_2IJ

Cp935

SCHGB2312_1T0

EUC_CN

TCHBIG5_1R0

BIG5

TCHEBCDIC937_3IB

Cp937

CLIENT_CHARSET接続パラメータを使用すれば、Teradata JDBC DriverのTeradataセッション文字セットからJava文字セットへの通常マッピングを上書きできますが、CLIENT_CHARSET接続パラメータは、Teradataの新規展開で使用するためのものではありません。これはレガシー サポート機能であり、データベースでサポートされない使用方法からの移行を支援するためのものです。ここで、サポートされない使用方法とは、非Latin文字をLatin列に格納し、ASCIIセッション文字セットを使用して非ASCII文字へのサポートされないアクセスをすることです。 CLIENT_CHARSET接続パラメータで誤ったJava文字セットを指定すると、データ破損が発生します。CLIENT_CHARSET接続パラメータが使用されている場合、Teradataはデータの忠実性または品質を保証できません。

文字マッピングの違い

表4 に、特定の文字セットで特定の文字コード ポイントがどのように異なるかを記載します。

表4: 内部Unicodeマッピング 

エンコーディング

文字名

SJIS

MS932

Cp943

Cp943C

Teradata内部Unicode

REVERSE SOLIDUS

0x5C

U+005C

U+005C

YEN SIGN

0x5C

U+00A5

U+00A5

WAVE DASH

0x8160

U+FF5E

U+301C

U+301C

U+301C

DOUBLE VERTICAL LINE

0x8161

U+2225

U+2016

U+2016

U+2016

MINUS SIGN

0x817C

U+FF0D

U+2212

U+2212

U+2212

Javaアプリケーションが、CHARまたはVARCHAR列にWAVE DASHまたはMINUS SIGN文字を格納しようとすると、データベースは、この要求を適切に処理できません。これは、WAVE DASHおよびMINUS SIGNの各文字のSJIS、EUC、およびEBCDICコード ポイントに複数のUnicode文字変換があるからです。

データベースは、各セッション文字セットでU+FF5Eを次の外部コード ポイントにマップします。次のマッピングには、データベース マップ ファイルが必要になります。

Teradata JDBC DriverからJavaアプリケーションへのデータフロー

問合わせの実行後、Javaアプリケーションは、通常、次のJDBC APIのどれかを使用して、文字データをjava.lang.StringオブジェクトとしてTeradata JDBC Driverから取得します。

または、Javaアプリケーションは、次のJDBC APIのどれかを使用して、文字データをTeradata JDBC Driverから取得できます。

SQL文の修正

リリース3.1以前のTeradata JDBC Driverでは、アプリケーションがwhere句が指定されている?に対してsetNull()を呼び出した場合は必ず、出現した?をすべてIS NULLに置き換えて、SQL文を修正していました。

例えば、SQL文が以下の場合を考えます。

SELECT * from table1 where colid = ?

ここでアプリケーションがsetNull(1)を呼び出すと、Teradata JDBC DriverはSQL文を次のように書き換えていました。

SELECT * from table1 where colid is null

これは、SQL文がcolidがNullである行をすべて戻してしまうため、正しい使用方法ではありません。正しいSQL文は次のようになります。

SELECT * from table1 where colid = null

NullはNull自身を含めいずれの値とも等しくないため、この文は行を戻さない点に注意してください。

この問題は、リリース3.2のTeradata JDBC Driverで修正されましたが、修正によりいくつかのアプリケーションの出力が変更される可能性があります。

Null式のポリシー

Teradata Database SQL関数、演算子、式および述部』には、null値を伴う比較(=等号演算子を含む)の結果について、次に示すポリシーが記載されています。

比較するいずれかの式がNULLの場合、比較結果は不明です。

比較するフィールドがNULLとなる場合に比較結果としてTRUEを提供するには、文にIS [NOT] NULL演算子が含まれている必要があります。

SQL文の訂正

リリース3.3ドライバでは動作しない不正なSQL文を修正するには、例として次の情報を活用してください。 

アプリケーションが次のようなSQL文を使用する場合を考えます。

SELECT * from table1 where colid = ?

ここで、アプリケーションがnull値の引数または非null値の引数のいずれかを?パラメータとバインドしても、アプリケーションはどちらの場合にも=比較演算子がTrueを戻すと期待しているかも知れません。これは、リリース3.1以前のTeradata JDBC DriverはこのSQL文を修正し、その動作を提供するからです。

もしアプリケーションがその動作を期待する場合、SQL文を以下の通り変更します。

SELECT * from table1 where colid = ? or ? is null and colid is null

さらに、アプリケーションを変更し、引数を両方の?パラメータに2回バインドします。