public class BasicExclusiveControlManager extends java.lang.Object implements ExclusiveControlManager
ExclusiveControlManagerの基本実装クラス。| Constructor and Description | 
|---|
BasicExclusiveControlManager()  | 
| Modifier and Type | Method and Description | 
|---|---|
void | 
addVersion(ExclusiveControlContext context)
バージョン番号を追加する。 
 | 
void | 
checkVersions(java.util.List<Version> versions)
バージョン番号が更新されていないかチェックする。(楽観的ロック) 
 | 
protected ExclusiveControlTable | 
createExclusiveControlTableSchemaAndSqlHolder(java.lang.String tableName,
                                             java.lang.String versionColumnName,
                                             java.lang.String... primaryKeyColumnNames)
排他制御用テーブルのスキーマ情報から 
ExclusiveControlTableを生成する。
 
 下記のメソッドから各SQL文のテンプレートを取得し、プレースホルダを置換することでSQL文を作成する。
 SQL文を変更したい場合は、下記メソッドをオーバライドして対応する。
 
 getSelectSqlTemplate()
 getSelectAndCheckSqlTemplate()
 getInsertSqlTemplate()
 getUpdateSqlTemplate()
 getUpdateAndCheckSqlTemplate()
 getDeleteSqlTemplate()
 
 デフォルト実装で作成されるSQL文は下記のとおり。 | 
protected java.lang.String | 
getDeleteSqlTemplate()
バージョン番号を削除するSQL文のテンプレートを取得する。 
 | 
protected ExclusiveControlTable | 
getExclusiveControlTableHolder(ExclusiveControlContext context)
排他制御用テーブルに対応した 
ExclusiveControlTableを取得する。
 
 getExclusiveControlTableHolder(String, String, String...)に処理を委譲する。 | 
protected ExclusiveControlTable | 
getExclusiveControlTableHolder(java.lang.String tableName,
                              java.lang.String versionColumnName,
                              java.lang.String... primaryKeyColumnNames)
排他制御用テーブルに対応した 
ExclusiveControlTableを取得する。
 
 一度生成したExclusiveControlTableは、メモリ上にキャッシュしている。
 このため、キャッシュに存在する場合は、キャッシュしているものを返し、
 キャッシュに存在しない場合は、ExclusiveControlTableを生成し、キャッシュに追加したものを返す。
 ExclusiveControlTableの生成では、排他制御用テーブルのスキーマ情報からSQL文を作成する。 | 
protected ExclusiveControlTable | 
getExclusiveControlTableHolder(Version version)
排他制御用テーブルに対応した 
ExclusiveControlTableを取得する。
 
 getExclusiveControlTableHolder(String, String, String...)に処理を委譲する。 | 
protected java.lang.Long | 
getInitialVersion()
初期バージョン番号を取得する。
 
 このメソッドは、バージョン番号追加時に使用される。
 デフォルト実装では、"1"を返す。 
 | 
protected java.lang.String | 
getInsertColumnsAndValues(java.lang.String[] primaryKeyColumnNames,
                         java.lang.String versionColumnName)
INSERT文のカラムと値を取得する。 
 | 
protected java.lang.String | 
getInsertSqlTemplate()
バージョン番号を追加するSQL文のテンプレートを取得する。 
 | 
protected Message | 
getOptimisticLockErrorMessage()
楽観的ロックエラー発生時のメッセージを取得する。 
 | 
protected java.lang.String | 
getPrimaryKeysCondition(java.lang.String[] columnNames)
主キー条件を取得する。 
 | 
protected java.lang.String | 
getSelectAndCheckSqlTemplate()
バージョン番号を取得するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。 
 | 
protected java.lang.String | 
getSelectSqlTemplate()
バージョン番号を取得するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。 
 | 
protected java.lang.String | 
getUpdateAndCheckSqlTemplate()
バージョン番号を更新するSQL文(バージョン番号の更新チェックあり)のテンプレートを取得する。 
 | 
protected java.lang.String | 
getUpdateSqlTemplate()
バージョン番号を更新するSQL文(バージョン番号の更新チェックなし)のテンプレートを取得する。 
 | 
Version | 
getVersion(ExclusiveControlContext context)
バージョン番号を取得する。(楽観的ロック) 
 | 
void | 
removeVersion(ExclusiveControlContext context)
バージョン番号を削除する。 
 | 
void | 
setOptimisticLockErrorMessageId(java.lang.String optimisticLockErrorMessageId)
楽観ロックエラーメッセージIDを設定する。 
 | 
void | 
updateVersion(ExclusiveControlContext context)
バージョン番号を更新する。(悲観的ロック) 
 | 
void | 
updateVersionsWithCheck(java.util.List<Version> versions)
バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック) 
 | 
public void setOptimisticLockErrorMessageId(java.lang.String optimisticLockErrorMessageId)
optimisticLockErrorMessageId - 楽観ロックエラーメッセージIDpublic Version getVersion(ExclusiveControlContext context)
getVersion in interface ExclusiveControlManagercontext - 排他制御コンテキストpublic void checkVersions(java.util.List<Version> versions)
checkVersions in interface ExclusiveControlManagerversions - バージョン番号protected Message getOptimisticLockErrorMessage()
public void updateVersionsWithCheck(java.util.List<Version> versions)
updateVersionsWithCheck in interface ExclusiveControlManagerversions - バージョン番号public void updateVersion(ExclusiveControlContext context)
updateVersion in interface ExclusiveControlManagercontext - 排他制御コンテキストprotected java.lang.Long getInitialVersion()
public void addVersion(ExclusiveControlContext context)
addVersion in interface ExclusiveControlManagercontext - 排他制御コンテキストpublic void removeVersion(ExclusiveControlContext context)
removeVersion in interface ExclusiveControlManagercontext - 排他制御コンテキストprotected ExclusiveControlTable getExclusiveControlTableHolder(ExclusiveControlContext context)
ExclusiveControlTableを取得する。
 
 getExclusiveControlTableHolder(String, String, String...)に処理を委譲する。context - 排他制御コンテキストExclusiveControlTableprotected ExclusiveControlTable getExclusiveControlTableHolder(Version version)
ExclusiveControlTableを取得する。
 
 getExclusiveControlTableHolder(String, String, String...)に処理を委譲する。version - バージョン番号ExclusiveControlTableprotected ExclusiveControlTable getExclusiveControlTableHolder(java.lang.String tableName, java.lang.String versionColumnName, java.lang.String... primaryKeyColumnNames)
ExclusiveControlTableを取得する。
 
 一度生成したExclusiveControlTableは、メモリ上にキャッシュしている。
 このため、キャッシュに存在する場合は、キャッシュしているものを返し、
 キャッシュに存在しない場合は、ExclusiveControlTableを生成し、キャッシュに追加したものを返す。
 ExclusiveControlTableの生成では、排他制御用テーブルのスキーマ情報からSQL文を作成する。tableName - 排他制御用テーブルのテーブル名versionColumnName - バージョン番号カラム名primaryKeyColumnNames - 主キーのカラム名ExclusiveControlTablecreateExclusiveControlTableSchemaAndSqlHolder(String, String, String...)protected ExclusiveControlTable createExclusiveControlTableSchemaAndSqlHolder(java.lang.String tableName, java.lang.String versionColumnName, java.lang.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"
     
 tableName - 排他制御用テーブルのテーブル名versionColumnName - バージョン番号カラム名primaryKeyColumnNames - 主キーのカラム名ExclusiveControlTableprotected java.lang.String getSelectSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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"
 
 protected java.lang.String getSelectAndCheckSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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"
 
 protected java.lang.String getInsertSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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)"
 
 protected java.lang.String getUpdateSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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"
 
 protected java.lang.String getUpdateAndCheckSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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"
 
 protected java.lang.String getDeleteSqlTemplate()
 下記のプレースホルダを使用してテンプレートを作成する。
 
 $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"
 
 protected java.lang.String getInsertColumnsAndValues(java.lang.String[] primaryKeyColumnNames,
                                                     java.lang.String versionColumnName)
primaryKeyColumnNames - 主キーカラム名versionColumnName - バージョン番号カラム名protected java.lang.String getPrimaryKeysCondition(java.lang.String[] columnNames)
columnNames - カラム名