主コンテンツへ
Oracle® Fusion Middleware Oracle GoldenGate for Big Dataの統合
リリース12.3.1.1
E89944-01
目次へ移動
目次

前
次

7 Java Database Connectivityハンドラの使用

この章では、Java Database Connectivity (JDBC)ハンドラについて説明し、その機能を理解できるように例を示します。

トピック:

7.1 概要

汎用の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

7.2 詳細な機能

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

トピック:

7.2.1 単一操作モード

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

7.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

7.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

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

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

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

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

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

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

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

ここでは、JDBCハンドラのコンポーネントの構成とハンドラの実行について説明します。

注意:

データ型マッピング、列マッピング、列関数などの機能の使用を向上させるには、JDBCハンドラとともにJDBCメタデータ・プロバイダを使用する必要があります。

トピック:

7.3.1 Javaクラスパス

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

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

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

7.3.2 ハンドラ構成

プロパティ・ファイルを使用して、JDBCハンドラの操作を構成します。JDBCハンドラの選択を有効にするには、まずgg.handler.name.type=jdbcを指定してハンドラ・タイプを構成してから、次に示す他のJDBCプロパティを構成する必要があります。

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

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

gg.handler.name.type

必須

jdbc

なし

JDBCハンドラを選択し、変更データ取得をJDBCにストリーミングします。

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つ追加されます。

7.3.3 文のキャッシュ

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

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

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

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

INSERT

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

UPDATE

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

DELETE

(表名、操作タイプ)

TRUNCATE

(表名、操作タイプ)

7.3.4 エラー処理の設定

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.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

7.4 サンプル構成

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

トピック:

7.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

7.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

7.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

7.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:<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桁の時間と2桁の最小オフセットのタイムゾーン。