17 Java Database Connectivityハンドラの使用
Java Database Connectivity (JDBC)ハンドラの使用方法について学習します。このハンドラにより、ソース・トランザクション・データをターゲットまたはデータベースに複製できます。
この章では、JDBCハンドラの使用方法について説明します。
- 概要
- 詳細な機能
JDBCハンドラは、JDBCインタフェースを使用してターゲットまたはデータベースにソース・トランザクション・データを複製します。 - JDBCハンドラの設定および実行
列マッピング機能、列関数機能および適切なデータ型マッピングを取得するには、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.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
親トピック: JDBCハンドラの設定および実行
17.3.2 ハンドラ構成
プロパティ・ファイルを使用して、JDBCハンドラの操作を構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
JDBCハンドラの選択を有効にするには、まずgg.handler.name.type=jdbc
およびその他のJDBCプロパティを次のように指定してハンドラ・タイプを構成する必要があります。
表17-1 JDBCハンドラの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
|
なし |
JDBCハンドラを選択し、チェンジ・データ・キャプチャをnameにストリーミングします。 |
|
必須 |
有効なJDBC接続URL |
なし |
ターゲット固有のJDBC接続URL。 |
|
ターゲット・データベース依存。 |
ターゲット固有のJDBCドライバ・クラス名 |
なし |
ターゲット固有のJDBCドライバ・クラス名。 |
|
ターゲット・データベース依存。 |
有効なユーザー名 |
なし |
ターゲット・データベースへのJDBC接続に使用するユーザー名。 |
|
ターゲット・データベース依存。 |
有効なパスワード |
なし |
ターゲット・データベースへのJDBC接続に使用するパスワード。 |
|
オプション |
符号なし整数 |
ターゲット・データベース依存 |
このプロパティを指定しないと、JDBCハンドラは、アクティブな準備済SQL文の最大数を示すターゲット依存のデータベース・メタデータを問い合せます。一部のターゲットではこのメタデータを指定しないため、アクティブなSQL文のデフォルト値(256)が使用されます。 このプロパティを指定すると、JDBCハンドラは、ターゲット・データベースでこのようなメタデータを問い合せることはせず、構成で指定されたプロパティ値を使用します。 どちらの場合でも、JDBCハンドラでアクティブなSQL文の合計数を超えそうになることが判明すると、最も古いSQL文がキャッシュから削除され、新しいSQL文が1つ追加されます。 |
親トピック: JDBCハンドラの設定および実行
17.3.3 文のキャッシュ
DML操作を高速化するために、JDBCドライバの実装では、通常複数の文をキャッシュできます。この構成により、同じプロファイルまたはテンプレートを共有する操作の文を再準備しなくて済みます。
JDBCハンドラは、文キャッシュを使用してプロセスを高速化し、基礎となるJDBCドライバでサポートされているのと同じ数の文をキャッシュします。キャッシュはLRU cacheを使用して実装されます。keyは操作のプロファイル(StatementCacheKey
クラスのインスタンスとしてメモリーに内部的に格納される)で、valueはPreparedStatement
オブジェクト自体です。
StatementCacheKey
オブジェクトには、JDBCハンドラでサポートされている様々なDMLプロファイルの次の情報が含まれています。
DML操作タイプ | StatementCacheKeyには次のタプルが含まれる。 |
---|---|
|
(表名、操作タイプ、操作後イメージの順序付き列索引) |
|
(表名、操作タイプ、操作後イメージの順序付き列索引) |
|
(表名、操作タイプ) |
|
(表名、操作タイプ) |
親トピック: JDBCハンドラの設定および実行
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.duplicateErrorCodes
、gg.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
親トピック: JDBCハンドラの設定および実行
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桁の最小オフセットのタイムゾーン。