Class BasicExclusiveControlManager

java.lang.Object
nablarch.common.exclusivecontrol.BasicExclusiveControlManager
All Implemented Interfaces:
ExclusiveControlManager

public class BasicExclusiveControlManager extends Object implements ExclusiveControlManager
ExclusiveControlManagerの基本実装クラス。
Author:
Kiyohito Itoh
  • Constructor Details

    • BasicExclusiveControlManager

      public BasicExclusiveControlManager()
  • Method Details

    • setOptimisticLockErrorMessageId

      public void setOptimisticLockErrorMessageId(String optimisticLockErrorMessageId)
      楽観ロックエラーメッセージIDを設定する。
      Parameters:
      optimisticLockErrorMessageId - 楽観ロックエラーメッセージID
    • getVersion

      public Version getVersion(ExclusiveControlContext context)
      バージョン番号を取得する。(楽観的ロック)
      Specified by:
      getVersion in interface ExclusiveControlManager
      Parameters:
      context - 排他制御コンテキスト
      Returns:
      バージョン番号。バージョン番号が存在しない場合はnull
    • checkVersions

      public void checkVersions(List<Version> versions)
      バージョン番号が更新されていないかチェックする。(楽観的ロック)
      Specified by:
      checkVersions in interface ExclusiveControlManager
      Parameters:
      versions - バージョン番号
    • getOptimisticLockErrorMessage

      protected Message getOptimisticLockErrorMessage()
      楽観的ロックエラー発生時のメッセージを取得する。
      Returns:
      楽観的ロックエラー発生時のメッセージ。メッセージIDが設定されていない場合はnull
    • updateVersionsWithCheck

      public void updateVersionsWithCheck(List<Version> versions)
      バージョン番号の更新チェックとバージョン番号の更新を行う。(楽観的ロック)
      Specified by:
      updateVersionsWithCheck in interface ExclusiveControlManager
      Parameters:
      versions - バージョン番号
    • updateVersion

      public void updateVersion(ExclusiveControlContext context)
      バージョン番号を更新する。(悲観的ロック)
      Specified by:
      updateVersion in interface ExclusiveControlManager
      Parameters:
      context - 排他制御コンテキスト
    • getInitialVersion

      protected Long getInitialVersion()
      初期バージョン番号を取得する。

      このメソッドは、バージョン番号追加時に使用される。 デフォルト実装では、"1"を返す。

      Returns:
      初期バージョン番号
    • addVersion

      public void addVersion(ExclusiveControlContext context)
      バージョン番号を追加する。
      Specified by:
      addVersion in interface ExclusiveControlManager
      Parameters:
      context - 排他制御コンテキスト
    • removeVersion

      public void removeVersion(ExclusiveControlContext context)
      バージョン番号を削除する。
      Specified by:
      removeVersion in interface ExclusiveControlManager
      Parameters:
      context - 排他制御コンテキスト
    • getExclusiveControlTableHolder

      protected ExclusiveControlTable getExclusiveControlTableHolder(ExclusiveControlContext context)
      排他制御用テーブルに対応したExclusiveControlTableを取得する。

      getExclusiveControlTableHolder(String, String, String...)に処理を委譲する。

      Parameters:
      context - 排他制御コンテキスト
      Returns:
      排他制御用テーブルに対応したExclusiveControlTable
    • getExclusiveControlTableHolder

      protected ExclusiveControlTable getExclusiveControlTableHolder(Version version)
      排他制御用テーブルに対応した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文を変更したい場合は、下記メソッドをオーバライドして対応する。

      デフォルト実装で作成されるSQL文は下記のとおり。
       排他制御用テーブルのスキーマ情報を下記に示す。
       
       排他制御用テーブルのテーブル名: 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

      protected String 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

      protected String 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

      protected String 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

      protected String 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

      protected String 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

      protected String 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

      protected String getPrimaryKeysCondition(String[] columnNames)
      主キー条件を取得する。
      Parameters:
      columnNames - カラム名
      Returns:
      主キー条件