9.2.26 Java Database Connectivity
Java Database Connectivity (JDBC)ハンドラの使用方法について学習します。このハンドラにより、ソース・トランザクション・データをターゲットまたはデータベースに複製できます。
この章では、JDBCハンドラの使用方法について説明します。
- 概要
- 詳細な機能
 JDBCハンドラは、JDBCインタフェースを使用してターゲットまたはデータベースにソース・トランザクション・データを複製します。
- JDBCハンドラの設定および実行
 列マッピング機能、列関数機能および適切なデータ型マッピングを取得するには、JDBCハンドラとともにJDBCメタデータ・プロバイダを使用します。
- サンプル構成
親トピック: ターゲット
9.2.26.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を参照してください。
親トピック: Java Database Connectivity
9.2.26.2 詳細な機能
JDBCハンドラは、JDBCインタフェースを使用してターゲットまたはデータベースにソース・トランザクション・データを複製します。
親トピック: Java Database Connectivity
9.2.26.2.1 単一操作モード
JDBCハンドラは、証跡レコードがハンドラによって処理されると、すべての単一の証跡レコード(行操作)についてSQL操作を実行します。JDBCハンドラでは、バッチ操作を行うJDBC APIのBATCHSQL機能は使用しません。 
                        
親トピック: 詳細な機能
9.2.26.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
親トピック: 詳細な機能
9.2.26.2.4 Netezzaデータベース・データ型
Netezzaデータベース・ターゲットでは、次の列データ型がサポートされています。
- byteint
- smallint
- integer
- bigint
- numeric(p,s)
- numeric(p)
- float(p)
- Real
- double
- char
- varchar
- nchar
- nvarchar
- date
- time
- Timestamp
親トピック: 詳細な機能
9.2.26.2.5 Redshiftデータベース・データ型
Redshiftデータベース・ターゲットでは、次の列データ型がサポートされています。
- SMALLINT
- INTEGER
- BIGINT
- DECIMAL
- REAL
- DOUBLE
- CHAR
- VARCHAR
- DATE
- TIMESTAMP
親トピック: 詳細な機能
9.2.26.3 JDBCハンドラの設定および実行
列マッピング機能、列関数機能および適切なデータ型マッピングを取得するには、JDBCハンドラとともにJDBCメタデータ・プロバイダを使用します。
次の各トピックでは、JDBCハンドラ・コンポーネントを構成して、ハンドラを実行する手順について説明します。
9.2.26.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ハンドラの設定および実行
9.2.26.3.2 ハンドラ構成
プロパティ・ファイルを使用して、JDBCハンドラの操作を構成します。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)
JDBCハンドラの選択を有効にするには、まずgg.handler.name.type=jdbcおよびその他のJDBCプロパティを次のように指定してハンドラ・タイプを構成する必要があります。
                        
表9-33 JDBCハンドラの構成プロパティ
| プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 | 
|---|---|---|---|---|
| 
 | 必須 | 
 | なし | JDBCハンドラを選択し、チェンジ・データ・キャプチャをnameにストリーミングします。 | 
| 
 | 必須 | 有効なJDBC接続URL | なし | ターゲット固有のJDBC接続URL。 | 
| 
 | ターゲット・データベース依存。 | ターゲット固有のJDBCドライバ・クラス名 | なし | ターゲット固有のJDBCドライバ・クラス名。 | 
| 
 | ターゲット・データベース依存。 | 有効なユーザー名 | なし | ターゲット・データベースへのJDBC接続に使用するユーザー名。 | 
| 
 | ターゲット・データベース依存。 | 有効なパスワード | なし | ターゲット・データベースへのJDBC接続に使用するパスワード。 | 
| 
 | オプション | 符号なし整数 | ターゲット・データベース依存 | このプロパティを指定しないと、JDBCハンドラは、アクティブな準備済SQL文の最大数を示すターゲット依存のデータベース・メタデータを問い合せます。一部のターゲットではこのメタデータを指定しないため、アクティブなSQL文のデフォルト値(256)が使用されます。 このプロパティを指定すると、JDBCハンドラは、ターゲット・データベースでこのようなメタデータを問い合せることはせず、構成で指定されたプロパティ値を使用します。 どちらの場合でも、JDBCハンドラでアクティブなSQL文の合計数を超えそうになることが判明すると、最も古いSQL文がキャッシュから削除され、新しいSQL文が1つ追加されます。 | 
| gg.mdp.connectionRetries | オプション | 整数値 | 3 | ターゲット・データ・ウェアハウスへの接続が再試行される回数を指定します。 | 
| gg.eventhandler.snowflake.connectionRetryIntervalSeconds | オプション | 整数値 | 30 | 接続再試行間の遅延(分単位)を指定します。 | 
親トピック: JDBCハンドラの設定および実行
9.2.26.3.3 文のキャッシュ
DML操作を高速化するために、JDBCドライバの実装では、通常複数の文をキャッシュできます。この構成により、同じプロファイルまたはテンプレートを共有する操作の文を再準備しなくて済みます。
JDBCハンドラは、文キャッシュを使用してプロセスを高速化し、基礎となるJDBCドライバでサポートされているのと同じ数の文をキャッシュします。キャッシュはLRU cacheを使用して実装されます。keyは操作のプロファイル(StatementCacheKeyクラスのインスタンスとしてメモリーに内部的に格納される)で、valueはPreparedStatementオブジェクト自体です。
                        
StatementCacheKeyオブジェクトには、JDBCハンドラでサポートされている様々なDMLプロファイルの次の情報が含まれています。
                        
| DML操作タイプ | StatementCacheKeyには次のタプルが含まれる。 | 
|---|---|
| 
 | (表名、操作タイプ、操作後イメージの順序付き列索引) | 
| 
 | (表名、操作タイプ、操作後イメージの順序付き列索引) | 
| 
 | (表名、操作タイプ) | 
| 
 | (表名、操作タイプ) | 
親トピック: JDBCハンドラの設定および実行
9.2.26.3.4 エラー処理の設定
JDBCハンドラは、Oracle GoldenGateパラメータREPERRORおよびHANDLECOLLISIONSの使用をサポートしています。 
                        
ターゲット・データベースで別のエラー・コードのマッピングを定義するには、ハンドラ・プロパティ・ファイルに次のプロパティを構成する必要があります。
- 
                                 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=60MySQL Databaseターゲットのエラー・コードの例
gg.error.duplicateErrorCodes=1022,1062 
gg.error.notFoundErrorCodes=1329 
gg.error.deadlockErrorCodes=1213,1614親トピック: JDBCハンドラの設定および実行
9.2.26.4 サンプル構成
次の各トピックでは、Javaアダプタ・プロパティ・ファイルのJDBCハンドラでサポートされているデータベースのサンプル構成を示します。
- Oracle Databaseターゲットの例
- JDBCメタデータ・プロバイダを使用したOracle Databaseターゲットの例
- MySQL Databaseターゲットの例
- JDBCメタデータ・プロバイダを使用したMySQL Databaseターゲットの例
親トピック: Java Database Connectivity
9.2.26.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親トピック: サンプル構成
9.2.26.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親トピック: サンプル構成
9.2.26.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親トピック: サンプル構成
9.2.26.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桁の最小オフセットのタイムゾーン。