Package nablarch.common.exclusivecontrol
Class BasicExclusiveControlManager
java.lang.Object
nablarch.common.exclusivecontrol.BasicExclusiveControlManager
- All Implemented Interfaces:
ExclusiveControlManager
ExclusiveControlManagerの基本実装クラス。- Author:
- Kiyohito Itoh
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidaddVersion(ExclusiveControlContext context) バージョン番号を追加する。voidcheckVersions(List<Version> versions) バージョン番号が更新されていないかチェックする。(楽観的ロック)protected ExclusiveControlTablecreateExclusiveControlTableSchemaAndSqlHolder(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルのスキーマ情報からExclusiveControlTableを生成する。protected Stringバージョン番号を削除するSQL文のテンプレートを取得する。protected ExclusiveControlTablegetExclusiveControlTableHolder(String tableName, String versionColumnName, String... primaryKeyColumnNames) 排他制御用テーブルに対応したExclusiveControlTableを取得する。protected ExclusiveControlTable排他制御用テーブルに対応したExclusiveControlTableを取得する。protected ExclusiveControlTablegetExclusiveControlTableHolder(Version version) 排他制御用テーブルに対応したExclusiveControlTableを取得する。protected Long初期バージョン番号を取得する。protected StringgetInsertColumnsAndValues(String[] primaryKeyColumnNames, String versionColumnName) INSERT文のカラムと値を取得する。protected Stringバージョン番号を追加するSQL文のテンプレートを取得する。protected Message楽観的ロックエラー発生時のメッセージを取得する。protected StringgetPrimaryKeysCondition(String[] columnNames) 主キー条件を取得する。protected Stringバージョン番号を取得するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。protected Stringバージョン番号を取得するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。protected Stringバージョン番号を更新するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。protected Stringバージョン番号を更新するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。getVersion(ExclusiveControlContext context) バージョン番号を取得する。(楽観的ロック)voidremoveVersion(ExclusiveControlContext context) バージョン番号を削除する。voidsetOptimisticLockErrorMessageId(String optimisticLockErrorMessageId) 楽観ロックエラーメッセージIDを設定する。voidupdateVersion(ExclusiveControlContext context) バージョン番号を更新する。(悲観的ロック)voidupdateVersionsWithCheck(List<Version> versions) バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック)
-
Constructor Details
-
BasicExclusiveControlManager
public BasicExclusiveControlManager()
-
-
Method Details
-
setOptimisticLockErrorMessageId
楽観ロックエラーメッセージIDを設定する。- Parameters:
optimisticLockErrorMessageId- 楽観ロックエラーメッセージID
-
getVersion
バージョン番号を取得する。(楽観的ロック)- Specified by:
getVersionin interfaceExclusiveControlManager- Parameters:
context- 排他制御コンテキスト- Returns:
- バージョン番号。バージョン番号が存在しない場合はnull
-
checkVersions
バージョン番号が更新されていないかチェックする。(楽観的ロック)- Specified by:
checkVersionsin interfaceExclusiveControlManager- Parameters:
versions- バージョン番号
-
getOptimisticLockErrorMessage
楽観的ロックエラー発生時のメッセージを取得する。- Returns:
- 楽観的ロックエラー発生時のメッセージ。メッセージIDが設定されていない場合はnull
-
updateVersionsWithCheck
バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック)- Specified by:
updateVersionsWithCheckin interfaceExclusiveControlManager- Parameters:
versions- バージョン番号
-
updateVersion
バージョン番号を更新する。(悲観的ロック)- Specified by:
updateVersionin interfaceExclusiveControlManager- Parameters:
context- 排他制御コンテキスト
-
getInitialVersion
初期バージョン番号を取得する。 このメソッドは、バージョン番号追加時に使用される。 デフォルト実装では、"1"を返す。- Returns:
- 初期バージョン番号
-
addVersion
バージョン番号を追加する。- Specified by:
addVersionin interfaceExclusiveControlManager- Parameters:
context- 排他制御コンテキスト
-
removeVersion
バージョン番号を削除する。- Specified by:
removeVersionin 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:
- 主キー条件
-