public class BasicExclusiveControlManager extends java.lang.Object implements ExclusiveControlManager
ExclusiveControlManagerの基本実装クラス。| コンストラクタと説明 |
|---|
BasicExclusiveControlManager() |
| 修飾子とタイプ | メソッドと説明 |
|---|---|
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を生成する。 |
protected java.lang.String |
getDeleteSqlTemplate()
バージョン番号を削除するSQL文のテンプレートを取得する。
|
protected ExclusiveControlTable |
getExclusiveControlTableHolder(ExclusiveControlContext context)
排他制御用テーブルに対応した
ExclusiveControlTableを取得する。 |
protected ExclusiveControlTable |
getExclusiveControlTableHolder(java.lang.String tableName,
java.lang.String versionColumnName,
java.lang.String... primaryKeyColumnNames)
排他制御用テーブルに対応した
ExclusiveControlTableを取得する。 |
protected ExclusiveControlTable |
getExclusiveControlTableHolder(Version version)
排他制御用テーブルに対応した
ExclusiveControlTableを取得する。 |
protected java.lang.Long |
getInitialVersion()
初期バージョン番号を取得する。
|
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 インタフェース内 ExclusiveControlManagercontext - 排他制御コンテキストpublic void checkVersions(java.util.List<Version> versions)
checkVersions インタフェース内 ExclusiveControlManagerversions - バージョン番号protected Message getOptimisticLockErrorMessage()
public void updateVersionsWithCheck(java.util.List<Version> versions)
updateVersionsWithCheck インタフェース内 ExclusiveControlManagerversions - バージョン番号public void updateVersion(ExclusiveControlContext context)
updateVersion インタフェース内 ExclusiveControlManagercontext - 排他制御コンテキストprotected java.lang.Long getInitialVersion()
public void addVersion(ExclusiveControlContext context)
addVersion インタフェース内 ExclusiveControlManagercontext - 排他制御コンテキストpublic void removeVersion(ExclusiveControlContext context)
removeVersion インタフェース内 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 - カラム名