17 Java Database Connectivityハンドラの使用

Java Database Connectivity (JDBC)ハンドラの使用方法について学習します。このハンドラにより、ソース・トランザクション・データをターゲットまたはデータベースに複製できます。

この章では、JDBCハンドラの使用方法について説明します。

17.1 概要

汎用のJava Database Connectivity (JDBC)ハンドラでは、JDBCインタフェースを使用して、ターゲット・システムまたはデータベースにソース・トランザクション・データを複製できます。JDBC接続をサポートするターゲットで使用できます。

JDBC APIを使用して、リレーショナル・データベースからスプレッドシートやフラット・ファイルまで、事実上あらゆるデータ・ソースにアクセスできます。JDBCテクノロジは、JDBCハンドラが構築された共通ベースとしても機能します。JDBCメタデータ・プロバイダを使用したJDBCハンドラにより、列マッピングや列関数などのReplicat機能を使用することもできます。これらの機能の使用方法の詳細は、「メタデータ・プロバイダの使用」を参照してください。

JDBC APIの使用方法の詳細は、http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/index.htmlを参照してください。

17.2 詳細な機能

JDBCハンドラは、JDBCインタフェースを使用してターゲットまたはデータベースにソース・トランザクション・データを複製します。

17.2.1 単一操作モード

JDBCハンドラは、証跡レコードがハンドラによって処理されると、すべての単一の証跡レコード(行操作)についてSQL操作を実行します。JDBCハンドラでは、バッチ操作を行うJDBC APIのBATCHSQL機能は使用しません。

17.2.2 Oracle Databaseデータ型

Oracle Databaseターゲットでは、次の列データ型がサポートされています。

  • NUMBER
  • DECIMAL
  • INTEGER
  • FLOAT
  • REAL
  • DATE
  • TIMESTAMP
  • INTERVAL YEAR TO MONTH
  • INTERVAL DAY TO SECOND
  • CHAR
  • VARCHAR2
  • NCHAR
  • NVARCHAR2
  • RAW
  • CLOB
  • NCLOB
  • BLOB
  • TIMESTAMP WITH TIMEZONE脚注1
  • TIME WITH TIMEZONE脚注2

17.2.3 MySQL Databaseデータ型

MySQL Databaseターゲットでは、次の列データ型がサポートされています。

  • INT
  • REAL
  • FLOAT
  • DOUBLE
  • NUMERIC
  • DATE
  • DATETIME
  • TIMESTAMP
  • TINYINT
  • BOOLEAN
  • SMALLINT
  • BIGINT
  • MEDIUMINT
  • DECIMAL
  • BIT
  • YEAR
  • ENUM
  • CHAR
  • VARCHAR

17.2.4 Netezzaデータベース・データ型

Netezzaデータベース・ターゲットでは、次の列データ型がサポートされています。

  • byteint
  • smallint
  • integer
  • bigint
  • numeric(p,s)
  • numeric(p)
  • float(p)
  • Real
  • double
  • char
  • varchar
  • nchar
  • nvarchar
  • date
  • time
  • Timestamp

17.2.5 Redshiftデータベース・データ型

Redshiftデータベース・ターゲットでは、次の列データ型がサポートされています。

  • SMALLINT 
  • INTEGER
  • BIGINT
  • DECIMAL
  • REAL
  • DOUBLE
  • CHAR
  • VARCHAR
  • DATE
  • TIMESTAMP

17.3 JDBCハンドラの設定および実行

列マッピング機能、列関数機能および適切なデータ型マッピングを取得するには、JDBCハンドラとともにJDBCメタデータ・プロバイダを使用します。

次の各トピックでは、JDBCハンドラ・コンポーネントを構成して、ハンドラを実行する手順について説明します。

17.3.1 Javaクラスパス

gg.classpathプロパティを使用して、JDBC Java Driverの場所をハンドラのクラスパスに含める必要があります。

たとえば、MySQLデータベースの構成は次のようになります。

gg.classpath= /path/to/jdbc/driver/jar/mysql-connector-java-5.1.39-bin.jar

17.3.2 ハンドラ構成

プロパティ・ファイルを使用して、JDBCハンドラの操作を構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。

JDBCハンドラの選択を有効にするには、まずgg.handler.name.type=jdbcおよびその他のJDBCプロパティを次のように指定してハンドラ・タイプを構成する必要があります。

表17-1 JDBCハンドラの構成プロパティ

プロパティ 必須/オプション 有効な値 デフォルト 説明

gg.handler.name.type

必須

jdbc

なし

JDBCハンドラを選択し、チェンジ・データ・キャプチャをnameにストリーミングします。

gg.handler.name.connectionURL

必須

有効なJDBC接続URL

なし

ターゲット固有のJDBC接続URL。

gg.handler.name.DriverClass

ターゲット・データベース依存。

ターゲット固有のJDBCドライバ・クラス名

なし

ターゲット固有のJDBCドライバ・クラス名。

gg.handler.name.userName

ターゲット・データベース依存。

有効なユーザー名

なし

ターゲット・データベースへのJDBC接続に使用するユーザー名。

gg.handler.name.password

ターゲット・データベース依存。

有効なパスワード

なし

ターゲット・データベースへのJDBC接続に使用するパスワード。

gg.handler.name.maxActiveStatements

オプション

符号なし整数

ターゲット・データベース依存

このプロパティを指定しないと、JDBCハンドラは、アクティブな準備済SQL文の最大数を示すターゲット依存のデータベース・メタデータを問い合せます。一部のターゲットではこのメタデータを指定しないため、アクティブなSQL文のデフォルト値(256)が使用されます。

このプロパティを指定すると、JDBCハンドラは、ターゲット・データベースでこのようなメタデータを問い合せることはせず、構成で指定されたプロパティ値を使用します。 

どちらの場合でも、JDBCハンドラでアクティブなSQL文の合計数を超えそうになることが判明すると、最も古いSQL文がキャッシュから削除され、新しいSQL文が1つ追加されます。

17.3.3 文のキャッシュ

DML操作を高速化するために、JDBCドライバの実装では、通常複数の文をキャッシュできます。この構成により、同じプロファイルまたはテンプレートを共有する操作の文を再準備しなくて済みます。

JDBCハンドラは、文キャッシュを使用してプロセスを高速化し、基礎となるJDBCドライバでサポートされているのと同じ数の文をキャッシュします。キャッシュはLRU cacheを使用して実装されます。keyは操作のプロファイル(StatementCacheKeyクラスのインスタンスとしてメモリーに内部的に格納される)で、valueはPreparedStatementオブジェクト自体です。

StatementCacheKeyオブジェクトには、JDBCハンドラでサポートされている様々なDMLプロファイルの次の情報が含まれています。

DML操作タイプ StatementCacheKeyには次のタプルが含まれる。

INSERT

(表名、操作タイプ、操作後イメージの順序付き列索引)

UPDATE

(表名、操作タイプ、操作後イメージの順序付き列索引)

DELETE

(表名、操作タイプ)

TRUNCATE

(表名、操作タイプ)

17.3.4 エラー処理の設定

JDBCハンドラは、Oracle GoldenGateパラメータREPERRORおよびHANDLECOLLISIONSの使用をサポートしています。『Oracle GoldenGateリファレンス』を参照してください。

ターゲット・データベースで別のエラー・コードのマッピングを定義するには、ハンドラ・プロパティ・ファイルに次のプロパティを構成する必要があります。

gg.error.duplicateErrorCodes

重複したキー違反エラーを示す、ターゲット・データベースで定義されたエラー・コードのカンマ区切りリスト。ほとんどのJDBCドライバでは有効なエラー・コードが返されるため、エラー・コードに基づいてREPERRORアクションを構成できます。たとえば:

gg.error.duplicateErrorCodes=1062,1088,1092,1291,1330,1331,1332,1333
gg.error.notFoundErrorCodes

ターゲット・データベースでの欠落したDELETEまたはUPDATE操作を示すエラー・コードのカンマ区切りリスト。

場合によっては、UPDATEまたはDELETE操作でターゲット・データベースの行が何も変更されない場合はJDBCドライバ・エラーが発生するため、JDBCハンドラによる追加の処理は不要です。

ほとんどのJDBCドライバでは、DELETEまたはUPDATEがゼロ行に影響する場合のエラーが返されないため、JDBCハンドラは、欠落したUPDATEまたはDELETE操作を自動的に検出し、Replicatプロセスにnot-foundエラーを示すエラーをトリガーします。その後、Replicatプロセスは指定されたREPERRORアクションを実行できます。

ハンドラで使用されるデフォルトのエラー・コードはゼロです。このプロパティをゼロ以外の値に構成すると、構成されたエラー・コードの値は、ハンドラがnot-foundエラーをトリガーするときに使用されます。たとえば:

gg.error.notFoundErrorCodes=1222
gg.error.deadlockErrorCodes

ターゲット・データベースでのデッドロック・エラーを示すエラー・コードのカンマ区切りリスト。たとえば:

gg.error.deadlockErrorCodes=1213
コードの設定

エラー・コードがゼロに設定されていると、ReplicatがREPERRORおよびHANDLECOLLISIONSの構成に応答しないため、gg.error.duplicateErrorCodesgg.error.notFoundErrorCodesおよびgg.error.deadlockErrorCodesの各プロパティにゼロ以外のエラー・コードを設定することをお薦めします。

Oracle Databaseターゲットのエラー・コードの例

gg.error.duplicateErrorCodes=1 
gg.error.notFoundErrorCodes=0 
gg.error.deadlockErrorCodes=60

MySQL Databaseターゲットのエラー・コードの例

gg.error.duplicateErrorCodes=1022,1062 
gg.error.notFoundErrorCodes=1329 
gg.error.deadlockErrorCodes=1213,1614

17.4 サンプル構成

次の各トピックでは、Javaアダプタ・プロパティ・ファイルのJDBCハンドラでサポートされているデータベースのサンプル構成を示します。

17.4.1 Oracle Databaseターゲットの例

gg.handlerlist=jdbcwriter
gg.handler.jdbcwriter.type=jdbc

#Handler properties for Oracle database target
gg.handler.jdbcwriter.DriverClass=oracle.jdbc.driver.OracleDriver
gg.handler.jdbcwriter.connectionURL=jdbc:oracle:thin:@<DBServer address>:1521:<database name>
gg.handler.jdbcwriter.userName=<dbuser>
gg.handler.jdbcwriter.password=<dbpassword>
gg.classpath=/path/to/oracle/jdbc/driver/ojdbc5.jar
goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm

17.4.2 JDBCメタデータ・プロバイダを使用したOracle Databaseターゲットの例

gg.handlerlist=jdbcwriter
gg.handler.jdbcwriter.type=jdbc

#Handler properties for Oracle database target with JDBC Metadata provider
gg.handler.jdbcwriter.DriverClass=oracle.jdbc.driver.OracleDriver
gg.handler.jdbcwriter.connectionURL=jdbc:oracle:thin:@<DBServer address>:1521:<database name>
gg.handler.jdbcwriter.userName=<dbuser>
gg.handler.jdbcwriter.password=<dbpassword>
gg.classpath=/path/to/oracle/jdbc/driver/ojdbc5.jar
#JDBC Metadata provider for Oracle target
gg.mdp.type=jdbc
gg.mdp.ConnectionUrl=jdbc:oracle:thin:@<DBServer address>:1521:<database name>
gg.mdp.DriverClassName=oracle.jdbc.driver.OracleDriver
gg.mdp.UserName=<dbuser>
gg.mdp.Password=<dbpassword>
goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm

17.4.3 MySQL Databaseターゲットの例

gg.handlerlist=jdbcwriter
gg.handler.jdbcwriter.type=jdbc

#Handler properties for MySQL database target
gg.handler.jdbcwriter.DriverClass=com.mysql.jdbc.Driver
gg.handler.jdbcwriter.connectionURL=jdbc:<a target="_blank" href="mysql://">mysql://</a><DBServer address>:3306/<database name>
gg.handler.jdbcwriter.userName=<dbuser>
gg.handler.jdbcwriter.password=<dbpassword>
gg.classpath=/path/to/mysql/jdbc/driver//mysql-connector-java-5.1.39-bin.jar

goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm

17.4.4 JDBCメタデータ・プロバイダを使用したMySQL Databaseターゲットの例

gg.handlerlist=jdbcwriter
gg.handler.jdbcwriter.type=jdbc

#Handler properties for MySQL database target with JDBC Metadata provider
gg.handler.jdbcwriter.DriverClass=com.mysql.jdbc.Driver
gg.handler.jdbcwriter.connectionURL=jdbc:mysql://<DBServer address>:3306/<database name>
gg.handler.jdbcwriter.userName=<dbuser>
gg.handler.jdbcwriter.password=<dbpassword>
gg.classpath=/path/to/mysql/jdbc/driver//mysql-connector-java-5.1.39-bin.jar
#JDBC Metadata provider for MySQL target
gg.mdp.type=jdbc
gg.mdp.ConnectionUrl=jdbc:mysql://<DBServer address>:3306/<database name>
gg.mdp.DriverClassName=com.mysql.jdbc.Driver
gg.mdp.UserName=<dbuser>
gg.mdp.Password=<dbpassword>

goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm


脚注の凡例

脚注1:

2桁の時間と2桁の最小オフセットのタイムゾーン。


脚注2:

2桁の時間と2桁の最小オフセットのタイムゾーン。