この章では、Java Database Connectivity (JDBC)ハンドラについて説明し、その機能を理解できるように例を示します。
トピック:
汎用のJava Database Connectivity (JDBC)ハンドラには、JDBCインタフェースを使用してターゲットまたはデータベースにソース・トランザクション・データを複製する機能があり、このハンドラは、JDBC接続をサポートするターゲットに適用可能です。
JDBC APIを使用すると、リレーショナル・データベースからスプレッドシートやフラット・ファイルまで、事実上あらゆるデータ・ソースにアクセスできます。JDBCテクノロジは、JDBCハンドラが構築された共通ベースとしても機能します。JDBCメタデータ・プロバイダを使用したJDBCハンドラには、列マッピングや列関数などのReplicat機能を使用する追加の機能があります。「メタデータ・プロバイダの使用」を参照してください
詳細は、次に示すOracle Java JDBC APIのドキュメントのWebサイトを参照してください。
http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/index.html
JDBCハンドラは、JDBCインタフェースを使用してターゲット(またはデータベース)にソース・トランザクション・データを複製します。
トピック:
JDBCハンドラは、証跡レコードがハンドラによって処理されると、すべての単一の証跡レコード(行操作)についてSQL操作を実行します。JDBCハンドラでは、バッチ操作を行うJDBC APIのBATCHSQL
機能は使用しません。
MySQL Databaseターゲットでは、次の列データ型がサポートされています。
INT
REAL
FLOAT
DOUBLE
NUMERIC
DATE
DATETIME
TIMESTAMP
TINYINT
BOOLEAN
SMALLINT
BIGINT
MEDIUMINT
DECIMAL
BIT
YEAR
ENUM
CHAR
VARCHAR
ここでは、JDBCハンドラのコンポーネントの構成とハンドラの実行について説明します。
注意:
データ型マッピング、列マッピング、列関数などの機能の使用を向上させるには、JDBCハンドラとともにJDBCメタデータ・プロバイダを使用する必要があります。
トピック:
gg.classpath
プロパティを使用して、JDBC Java Driverの場所をハンドラのクラスパスに含める必要があります。
たとえば、MySQLデータベースの構成は次のようになります。
gg.classpath= /path/to/jdbc/driver/jar/mysql-connector-java-5.1.39-bin.jar
プロパティ・ファイルを使用して、JDBCハンドラの操作を構成します。JDBCハンドラの選択を有効にするには、まずgg.handler.name.type=jdbc
を指定してハンドラ・タイプを構成してから、次に示す他のJDBCプロパティを構成する必要があります。
表7-1 JDBCハンドラの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
|
なし |
JDBCハンドラを選択し、変更データ取得をJDBCにストリーミングします。 |
|
必須 |
有効なJDBC接続URL。 |
なし |
ターゲット固有のJDBC接続URL。 |
|
ターゲット・データベース依存。 |
ターゲット固有のJDBCドライバ・クラス名。 |
なし |
ターゲット固有のJDBCドライバ・クラス名。 |
|
ターゲット・データベース依存。 |
有効なユーザー名。 |
なし |
ターゲット・データベースへのJDBC接続に使用するユーザー名。 |
|
ターゲット・データベース依存。 |
有効なパスワード。 |
なし |
ターゲット・データベースへのJDBC接続に使用するパスワード。 |
|
オプション |
符号なし整数。 |
ターゲット・データベース依存 |
このプロパティを指定しないと、JDBCハンドラは、アクティブな準備済SQL文の最大数を示すターゲット依存のデータベース・メタデータを問い合せます。一部のターゲットではこのメタデータを指定しないため、アクティブなSQL文のデフォルト値(256)が使用されます。 このプロパティを指定すると、JDBCハンドラは、ターゲット・データベースでこのようなメタデータを問い合せることはせず、構成で指定されたプロパティ値を使用します。 どちらの場合でも、JDBCハンドラでアクティブなSQL文の合計数を超えそうになることが判明すると、最も古いSQL文がキャッシュから削除され、新しいSQL文が1つ追加されます。 |
通常、JDBCドライバを実装すると、DML操作の実行を高速化するために複数の文をキャッシュできます。これにより、同じプロファイルまたはテンプレートを共有する操作の文を再準備しなくて済みます。
JDBCハンドラは、文キャッシュを使用してプロセスを高速化し、基礎となるJDBCドライバでサポートされているのと同じ数の文をキャッシュします。キャッシュはLRU cacheを使用して実装されます。keyは操作のプロファイル(StatementCacheKey
クラスのインスタンスとしてメモリーに内部的に格納される)で、valueはPreparedStatement
オブジェクト自体です。
StatementCacheKey
オブジェクトには、JDBCハンドラでサポートされている様々なDMLプロファイルの次の情報が含まれています。
DML操作タイプ | StatementCacheKeyには次のタプルが含まれる。 |
---|---|
|
(表名、操作タイプ、操作後イメージの順序付き列索引) |
|
(表名、操作タイプ、操作後イメージの順序付き列索引) |
|
(表名、操作タイプ) |
|
(表名、操作タイプ) |
JDBCハンドラはREPERROR
およびHANDLECOLLISIONS
Oracle GoldenGateパラメータの使用をサポートします。『Oracle GoldenGateリファレンスfor Windows and UNIX』を参照してください。
次のように、ターゲット・データベースに別のエラー・コードのマッピングを定義する場合は、ハンドラ・プロパティ・ファイルに追加の構成が必要です。
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プロセスに「見つかりません」を示すエラーをトリガーします。その後、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
次の各項では、Javaアダプタ・プロパティ・ファイルからのJDBCハンドラでサポートされているデータベースの構成例を示します。
トピック:
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
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
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
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:<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 #JDBC Metadata provider for MySQL target gg.mdp.type=jdbc gg.mdp.ConnectionUrl=jdbc:<a target="_blank" href="mysql://">mysql://</a><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桁の最小オフセットのタイムゾーン。