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 ExclusiveControlManager
context
- 排他制御コンテキストpublic void checkVersions(java.util.List<Version> versions)
checkVersions
in interface ExclusiveControlManager
versions
- バージョン番号protected Message getOptimisticLockErrorMessage()
public void updateVersionsWithCheck(java.util.List<Version> versions)
updateVersionsWithCheck
in interface ExclusiveControlManager
versions
- バージョン番号public void updateVersion(ExclusiveControlContext context)
updateVersion
in interface ExclusiveControlManager
context
- 排他制御コンテキストprotected java.lang.Long getInitialVersion()
public void addVersion(ExclusiveControlContext context)
addVersion
in interface ExclusiveControlManager
context
- 排他制御コンテキストpublic void removeVersion(ExclusiveControlContext context)
removeVersion
in interface ExclusiveControlManager
context
- 排他制御コンテキストprotected ExclusiveControlTable getExclusiveControlTableHolder(ExclusiveControlContext context)
ExclusiveControlTable
を取得する。
getExclusiveControlTableHolder(String, String, String...)
に処理を委譲する。context
- 排他制御コンテキストExclusiveControlTable
protected ExclusiveControlTable getExclusiveControlTableHolder(Version version)
ExclusiveControlTable
を取得する。
getExclusiveControlTableHolder(String, String, String...)
に処理を委譲する。version
- バージョン番号ExclusiveControlTable
protected ExclusiveControlTable getExclusiveControlTableHolder(java.lang.String tableName, java.lang.String versionColumnName, java.lang.String... primaryKeyColumnNames)
ExclusiveControlTable
を取得する。
一度生成したExclusiveControlTable
は、メモリ上にキャッシュしている。
このため、キャッシュに存在する場合は、キャッシュしているものを返し、
キャッシュに存在しない場合は、ExclusiveControlTable
を生成し、キャッシュに追加したものを返す。
ExclusiveControlTable
の生成では、排他制御用テーブルのスキーマ情報からSQL文を作成する。tableName
- 排他制御用テーブルのテーブル名versionColumnName
- バージョン番号カラム名primaryKeyColumnNames
- 主キーのカラム名ExclusiveControlTable
createExclusiveControlTableSchemaAndSqlHolder(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
- 主キーのカラム名ExclusiveControlTable
protected 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
- カラム名