Package nablarch.common.exclusivecontrol
Class BasicExclusiveControlManager
java.lang.Object
nablarch.common.exclusivecontrol.BasicExclusiveControlManager
- All Implemented Interfaces:
ExclusiveControlManager
ExclusiveControlManager
の基本実装クラス。- Author:
- Kiyohito Itoh
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
addVersion
(ExclusiveControlContext context) バージョン番号を追加する。void
checkVersions
(List<Version> versions) バージョン番号が更新されていないかチェックする。(楽観的ロック)protected ExclusiveControlTable
createExclusiveControlTableSchemaAndSqlHolder
(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルのスキーマ情報からExclusiveControlTable
を生成する。protected String
バージョン番号を削除するSQL文のテンプレートを取得する。protected ExclusiveControlTable
getExclusiveControlTableHolder
(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルに対応したExclusiveControlTable
を取得する。protected ExclusiveControlTable
排他制御用テーブルに対応したExclusiveControlTable
を取得する。protected ExclusiveControlTable
getExclusiveControlTableHolder
(Version version) 排他制御用テーブルに対応したExclusiveControlTable
を取得する。protected Long
初期バージョン番号を取得する。protected String
getInsertColumnsAndValues
(String[] primaryKeyColumnNames, String versionColumnName) INSERT文のカラムと値を取得する。protected String
バージョン番号を追加するSQL文のテンプレートを取得する。protected Message
楽観的ロックエラー発生時のメッセージを取得する。protected String
getPrimaryKeysCondition
(String[] columnNames) 主キー条件を取得する。protected String
バージョン番号を取得するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。protected String
バージョン番号を取得するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。protected String
バージョン番号を更新するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。protected String
バージョン番号を更新するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。getVersion
(ExclusiveControlContext context) バージョン番号を取得する。(楽観的ロック)void
removeVersion
(ExclusiveControlContext context) バージョン番号を削除する。void
setOptimisticLockErrorMessageId
(String optimisticLockErrorMessageId) 楽観ロックエラーメッセージIDを設定する。void
updateVersion
(ExclusiveControlContext context) バージョン番号を更新する。(悲観的ロック)void
updateVersionsWithCheck
(List<Version> versions) バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック)
-
Constructor Details
-
BasicExclusiveControlManager
public BasicExclusiveControlManager()
-
-
Method Details
-
setOptimisticLockErrorMessageId
楽観ロックエラーメッセージIDを設定する。- Parameters:
optimisticLockErrorMessageId
- 楽観ロックエラーメッセージID
-
getVersion
バージョン番号を取得する。(楽観的ロック)- Specified by:
getVersion
in interfaceExclusiveControlManager
- Parameters:
context
- 排他制御コンテキスト- Returns:
- バージョン番号。バージョン番号が存在しない場合はnull
-
checkVersions
バージョン番号が更新されていないかチェックする。(楽観的ロック)- Specified by:
checkVersions
in interfaceExclusiveControlManager
- Parameters:
versions
- バージョン番号
-
getOptimisticLockErrorMessage
楽観的ロックエラー発生時のメッセージを取得する。- Returns:
- 楽観的ロックエラー発生時のメッセージ。メッセージIDが設定されていない場合はnull
-
updateVersionsWithCheck
バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック)- Specified by:
updateVersionsWithCheck
in interfaceExclusiveControlManager
- Parameters:
versions
- バージョン番号
-
updateVersion
バージョン番号を更新する。(悲観的ロック)- Specified by:
updateVersion
in interfaceExclusiveControlManager
- Parameters:
context
- 排他制御コンテキスト
-
getInitialVersion
初期バージョン番号を取得する。 このメソッドは、バージョン番号追加時に使用される。 デフォルト実装では、"1"を返す。- Returns:
- 初期バージョン番号
-
addVersion
バージョン番号を追加する。- Specified by:
addVersion
in interfaceExclusiveControlManager
- Parameters:
context
- 排他制御コンテキスト
-
removeVersion
バージョン番号を削除する。- Specified by:
removeVersion
in interfaceExclusiveControlManager
- Parameters:
context
- 排他制御コンテキスト
-
getExclusiveControlTableHolder
排他制御用テーブルに対応したExclusiveControlTable
を取得する。getExclusiveControlTableHolder(String, String, String...)
に処理を委譲する。- Parameters:
context
- 排他制御コンテキスト- Returns:
- 排他制御用テーブルに対応した
ExclusiveControlTable
-
getExclusiveControlTableHolder
排他制御用テーブルに対応したExclusiveControlTable
を取得する。getExclusiveControlTableHolder(String, String, String...)
に処理を委譲する。- Parameters:
version
- バージョン番号- Returns:
- 排他制御用テーブルに対応した
ExclusiveControlTable
-
getExclusiveControlTableHolder
protected ExclusiveControlTable getExclusiveControlTableHolder(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルに対応したExclusiveControlTable
を取得する。 一度生成したExclusiveControlTable
は、メモリ上にキャッシュしている。 このため、キャッシュに存在する場合は、キャッシュしているものを返し、 キャッシュに存在しない場合は、ExclusiveControlTable
を生成し、キャッシュに追加したものを返す。ExclusiveControlTable
の生成では、排他制御用テーブルのスキーマ情報からSQL文を作成する。- Parameters:
tableName
- 排他制御用テーブルのテーブル名versionColumnName
- バージョン番号カラム名primaryKeyColumnNames
- 主キーのカラム名- Returns:
- 排他制御用テーブルに対応した
ExclusiveControlTable
- See Also:
-
createExclusiveControlTableSchemaAndSqlHolder
protected ExclusiveControlTable createExclusiveControlTableSchemaAndSqlHolder(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルのスキーマ情報からExclusiveControlTable
を生成する。 下記のメソッドから各SQL文のテンプレートを取得し、プレースホルダを置換することでSQL文を作成する。 SQL文を変更したい場合は、下記メソッドをオーバライドして対応する。getSelectSqlTemplate()
getSelectAndCheckSqlTemplate()
getInsertSqlTemplate()
getUpdateSqlTemplate()
getUpdateAndCheckSqlTemplate()
getDeleteSqlTemplate()
排他制御用テーブルのスキーマ情報を下記に示す。 排他制御用テーブルのテーブル名: USER_TBL バージョン番号カラム名 : VERSION 主キーのカラム名 : USER_ID, PK2, PK3 バージョン番号を取得するSQL文(バージョン番号の更新チェックなし) "SELECT VERSION FROM USER_TBL WHERE USER_ID = :user_id AND PK2 = :pk2 AND PK3 = :pk3" バージョン番号を取得するSQL文(バージョン番号の更新チェックあり) "SELECT VERSION FROM USER_TBL WHERE USER_ID = :user_id AND PK2 = :pk2 AND PK3 = :pk3 AND VERSION = :version" バージョン番号を追加するSQL文 "INSERT INTO USER_TBL (USER_ID, PK2, PK3) VALUES (:user_id, :pk2, :pk3)" バージョン番号を更新するSQL文(バージョン番号の更新チェックなし) "UPDATE USER_TBL SET VERSION = (VERSION + 1) WHERE USER_ID = :user_id AND PK2 = :pk2 AND PK3 = :pk3" バージョン番号を更新するSQL文(バージョン番号の更新チェックあり) "UPDATE USER_TBL SET VERSION = (VERSION + 1) WHERE USER_ID = :user_id AND PK2 = :pk2 AND PK3 = :pk3 AND VERSION = :version" バージョン番号を削除するSQL文 "DELETE FROM USER_TBL WHERE WHERE USER_ID = :user_id AND PK2 = :pk2 AND PK3 = :pk3"
- Parameters:
tableName
- 排他制御用テーブルのテーブル名versionColumnName
- バージョン番号カラム名primaryKeyColumnNames
- 主キーのカラム名- Returns:
ExclusiveControlTable
-
getSelectSqlTemplate
バージョン番号を取得するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $VERSION$: バージョン番号カラム名 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $PRIMARY_KEYS_CONDITION$: 主キーの条件(例: "PK1 = :pk1 AND PK2 = :pk2") デフォルト実装では、下記のテンプレートを返す。 "SELECT $VERSION$ FROM $TABLE_NAME$ WHERE $PRIMARY_KEYS_CONDITION$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "SELECT VERSION FROM EXCLUSIVE_USER WHERE USER_ID = :user_id"
- Returns:
- バージョン番号を取得するSQL文(バージョン番号の更新チェックなし)のテンプレート
-
getSelectAndCheckSqlTemplate
バージョン番号を取得するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $VERSION$: バージョン番号カラム名 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $PRIMARY_KEYS_CONDITION$: 主キーの条件(例: "PK1 = :pk1 AND PK2 = :pk2") $VERSION_CONDITION$: バージョン番号の条件(例: "VERSION = :version") デフォルト実装では、下記のテンプレートを返す。 "SELECT $VERSION$ FROM $TABLE_NAME$ WHERE $PRIMARY_KEYS_CONDITION$ AND $VERSION_CONDITION$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "SELECT VERSION FROM EXCLUSIVE_USER WHERE USER_ID = :user_id AND VERSION = :version"
- Returns:
- バージョン番号を取得するSQL文(バージョン番号の更新チェックあり)のテンプレート
-
getInsertSqlTemplate
バージョン番号を追加するSQL文のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $COLUMNS_AND_VALUES$: INSERT文のカラム名と値(例: "(PK1, PK2, VERSION) VALUES (:pk1, :pk2, :version)") デフォルト実装では、下記のテンプレートを返す。 "INSERT INTO $TABLE_NAME$ $COLUMNS_AND_VALUES$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "INSERT INTO EXCLUSIVE_USER (USER_ID, VERSION) VALUES (:user_id, :version)"
- Returns:
- バージョン番号を追加するSQL文のテンプレート
-
getUpdateSqlTemplate
バージョン番号を更新するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $VERSION$: バージョン番号カラム名 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $PRIMARY_KEYS_CONDITION$: 主キーの条件(例: "PK1 = :pk1 AND PK2 = :pk2") デフォルト実装では、下記のテンプレートを返す。 "UPDATE $TABLE_NAME$ SET $VERSION$ = ($VERSION$ + 1) WHERE $PRIMARY_KEYS_CONDITION$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "UPDATE EXCLUSIVE_USER SET VERSION = (VERSION + 1) WHERE USER_ID = :user_id"
- Returns:
- バージョン番号を更新するSQL文(バージョン番号の更新チェックなし)のテンプレート
-
getUpdateAndCheckSqlTemplate
バージョン番号を更新するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $VERSION$: バージョン番号カラム名 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $PRIMARY_KEYS_CONDITION$: 主キーの条件(例: "PK1 = :pk1 AND PK2 = :pk2") $VERSION_CONDITION$: バージョン番号の条件(例: "VERSION = :version") デフォルト実装では、下記のテンプレートを返す。 "UPDATE $TABLE_NAME$ SET $VERSION$ = ($VERSION$ + 1) WHERE $PRIMARY_KEYS_CONDITION$ AND $VERSION_CONDITION$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "UPDATE EXCLUSIVE_USER SET VERSION = (VERSION + 1) WHERE USER_ID = :user_id AND VERSION = :version"
- Returns:
- バージョン番号を更新するSQL文(バージョン番号の更新チェックあり)のテンプレート
-
getDeleteSqlTemplate
バージョン番号を削除するSQL文のテンプレートを取得する。下記のプレースホルダを使用してテンプレートを作成する。 $TABLE_NAME$: 排他制御用テーブルのテーブル名 $PRIMARY_KEYS_CONDITION$: 主キーの条件(例: "PK1 = :pk1 AND PK2 = :pk2") デフォルト実装では、下記のテンプレートを返す。 "DELETE FROM $TABLE_NAME$ WHERE $PRIMARY_KEYS_CONDITION$" 変換例を下記に示す。 テーブル定義 CREATE TABLE EXCLUSIVE_USER ( USER_ID CHAR(6) NOT NULL, VERSION NUMBER(10) NOT NULL, PRIMARY KEY(USER_ID) ) テンプレートから作成されるSQL文 "DELETE FROM EXCLUSIVE_USER WHERE USER_ID = :user_id"
- Returns:
- バージョン番号を削除するSQL文のテンプレート
-
getInsertColumnsAndValues
protected String getInsertColumnsAndValues(String[] primaryKeyColumnNames, String versionColumnName) INSERT文のカラムと値を取得する。- Parameters:
primaryKeyColumnNames
- 主キーカラム名versionColumnName
- バージョン番号カラム名- Returns:
- INSERT文のカラムと値
-
getPrimaryKeysCondition
主キー条件を取得する。- Parameters:
columnNames
- カラム名- Returns:
- 主キー条件
-