クラス AbstractCursorItemReader<T>

実装されたすべてのインターフェース:
ItemReader<T>ItemStreamItemStreamReader<T>org.springframework.beans.factory.InitializingBean
既知の直属サブクラス
JdbcCursorItemReaderStoredProcedureItemReader

public abstract class AbstractCursorItemReader<T> extends AbstractItemCountingItemStreamItemReader<T> implements org.springframework.beans.factory.InitializingBean

データベースカーソルを開き、ResultSet の次の行を継続的に取得する単純なアイテムリーダーの抽象基本クラス。

デフォルトでは、カーソルは別の接続を使用して開かれます。カーソルの ResultSet は、周囲のトランザクションでのコミットやロールバックに関係なく開いたままになります。このリーダーのクライアントは、ロールバックで再提示する必要がある場合にアイテムをバッファリングする責任があります。このバッファリングは、提供されているステップ実装によって処理され、独自のステップ実装を記述している人にとってのみ問題になります。

オプションがあります(カーソルに使用される接続を残りのステップ処理と共有する setUseSharedExtendedConnection(boolean)。このフラグを true に設定する場合、DataSource を ExtendedConnectionDataSourceProxy にラップして、接続が閉じられて解放されるのを防ぐ必要があります。コミットはステップ処理の一部として実行されます。カーソルは "HOLD_CURSORS_OVER_COMMIT" の追加オプションを有効にして開かれるため、JDBC 3.0 以降をサポートする JDBC ドライバーも使用する必要があります。

AbstractItemCountingItemStreamItemReader.read() を呼び出すたびに、ResultSet の現在の位置にある行がマップされます。現在、next() への呼び出しを抑制する ResultSet の折り返しはありません。ただし、RowMapper が(誤って)現在の行をインクリメントする場合、次に read を呼び出すと、現在の行が予期した位置にあることが確認され、そうでない場合は DataAccessException がスローされます。ResultSet でこのような厳格な理由は、トランザクションの制御と再起動性を維持する必要があるためです。これにより、AbstractItemCountingItemStreamItemReader.read() を呼び出すたびに、ロールバックや再起動に関係なく、正しい行で ResultSet が返されます。

ExecutionContext : 現在の行はリスタートデータとして返され、同じデータから復元されると、カーソルが開かれ、現在の行がリスタートデータ内の値に設定されます。再起動のパフォーマンスを改善するには、setDriverSupportsAbsolute(boolean) を参照してください。

この ItemStream で close を呼び出すと、現在使用しているすべてのリソースが解放されます。(接続、ResultSet など)。その後、AbstractItemCountingItemStreamItemReader.read() が再び開かれるまで、再度呼び出すことは不正です。

既知の制限: Derby と一緒に使用する場合、setVerifyCursorPosition(boolean) は false である必要があります。これは、カーソル位置の検証に使用される ResultSet.getRow() 呼び出しが "TYPE_FORWARD_ONLY" 結果セットで使用できないためです。

サブクラスは本質的にスレッドセーフではありません。

作成者:
Lucas Ward, Peter Zozom, Robert Kasanicky, Thomas Risberg, Michael Minella, Mahmoud Ben Hassine
  • フィールドの詳細

    • log

      protected final org.apache.commons.logging.Log log
      サブクラスで利用可能なロガー
    • VALUE_NOT_SET

      public static final int VALUE_NOT_SET
      関連事項:
    • rs

      protected ResultSetSE rs
  • コンストラクターの詳細

    • AbstractCursorItemReader

      public AbstractCursorItemReader()
  • メソッドの詳細

    • afterPropertiesSet

      public void afterPropertiesSet() throws ExceptionSE
      必須プロパティが設定されていることを確認します。
      次で指定:
      インターフェース org.springframework.beans.factory.InitializingBeanafterPropertiesSet 
      例外:
      IllegalArgumentExceptionSE - データソースまたは SQL プロパティが設定されていない場合。
      ExceptionSE
    • setDataSource

      public void setDataSource(DataSourceSE dataSource)
      インジェクション用のデータソース用のパブリック setter。
      パラメーター:
      dataSource - 使用する DataSourceSE
    • getDataSource

      public DataSourceSE getDataSource()
      データソースのパブリック getter。
      戻り値:
      dataSource
    • applyStatementSettings

      protected void applyStatementSettings(PreparedStatementSE stmt) throws SQLExceptionSE
      フェッチサイズ、最大行数、クエリタイムアウトなどのステートメント設定を適用して、所定の JDBC ステートメント(または PreparedStatement または CallableStatement)を準備します。@param stmt 準備する JDBC ステートメント
      パラメーター:
      stmt - 構成する PreparedStatementSE
      例外:
      SQLExceptionSE - 提供された stmt との対話が失敗した場合
      関連事項:
    • getExceptionTranslator

      protected org.springframework.jdbc.support.SQLExceptionTranslator getExceptionTranslator()
      何も設定されていない場合、指定された DataSource のデフォルトの SQLErrorCodeSQLExceptionTranslator を作成します。
      戻り値:
      このインスタンスの例外トランスレータ。
    • translateSqlException

      protected org.springframework.dao.DataAccessException translateSqlException(StringSE task, StringSE sql, SQLExceptionSE ex)
    • handleWarnings

      protected void handleWarnings(StatementSE statement) throws org.springframework.jdbc.SQLWarningException, SQLExceptionSE
      警告を無視していない場合は SQLWarningException をスローし、それ以外の場合は(デバッグレベルで)警告をログに記録します。
      パラメーター:
      statement - 警告がある場合、警告を取得する現在のステートメント。
      例外:
      SQLExceptionSE - 指定されたステートメントとの対話が失敗した場合。
      org.springframework.jdbc.SQLWarningException
      関連事項:
      • SQLWarningException
    • setFetchSize

      public void setFetchSize(int fetchSize)
      この ResultSet オブジェクトにさらに行が必要な場合に、データベースからフェッチする行数に関するヒントを JDBC ドライバーに提供します。指定されたフェッチサイズがゼロの場合、JDBC ドライバーは値を無視します。
      パラメーター:
      fetchSize - 取得する行数
      関連事項:
    • setMaxRows

      public void setMaxRows(int maxRows)
      任意の ResultSet オブジェクトが含むことができる行の最大数の制限を、指定された数に設定します。
      パラメーター:
      maxRows - 新しい最大行数の制限。ゼロは制限がないことを意味します
      関連事項:
    • setQueryTimeout

      public void setQueryTimeout(int queryTimeout)
      ドライバーが Statement オブジェクトの実行を待機する秒数を、指定された秒数に設定します。制限を超えると、SQLException がスローされます。
      パラメーター:
      queryTimeout - seconds 新しいクエリタイムアウト制限(秒単位)。ゼロは制限がないことを意味します
      関連事項:
    • setIgnoreWarnings

      public void setIgnoreWarnings(boolean ignoreWarnings)
      SQLWarnings を無視するか(ログのみ)、例外をスローするかを設定します。
      パラメーター:
      ignoreWarnings - TRUE の場合、警告は無視されます
    • setVerifyCursorPosition

      public void setVerifyCursorPosition(boolean verifyCursorPosition)
      現在の行が RowMapper または RowCallbackHandler によって処理された後のカーソル位置の検証を許可します。デフォルト値は TRUE です。
      パラメーター:
      verifyCursorPosition - true の場合、カーソル位置が検証されます
    • setDriverSupportsAbsolute

      public void setDriverSupportsAbsolute(boolean driverSupportsAbsolute)
      JDBC ドライバーが ResultSetSE で絶対行の設定をサポートするかどうかを示します。ResultSet.absolute() をサポートする JDBC ドライバーでは、これを true に設定することをお勧めします。これは、特に大規模なデータセットの操作中にステップが失敗した場合に、パフォーマンスが向上する可能性があるためです。
      パラメーター:
      driverSupportsAbsolute - デフォルトで false 
      関連事項:
    • setUseSharedExtendedConnection

      public void setUseSharedExtendedConnection(boolean useSharedExtendedConnection)
      カーソルに使用される接続を他のすべての処理で使用し、同じトランザクションを共有するかどうかを示します。これが false (デフォルト) に設定されている場合、カーソルはその接続で使用して開かれ、残りのステップ処理で開始されるトランザクションには参加しません。このフラグを true に設定した場合は、各コミット後に接続が閉じられたり解放されたりしないように、DataSource を ExtendedConnectionDataSourceProxy でラップする必要があります。

      このオプションを true に設定すると、カーソルを開くために使用されるステートメントが "READ_ONLY" オプションと "HOLD_CURSORS_OVER_COMMIT" オプションの両方を使用して作成されます。これにより、トランザクションの開始とステップ処理で実行されるコミットの間、カーソルを開いたままにすることができます。この機能を使用するには、これをサポートするデータベースと、JDBC 3.0 以降をサポートする JDBC ドライバーが必要です。

      パラメーター:
      useSharedExtendedConnection - デフォルトで false 
    • isUseSharedExtendedConnection

      public boolean isUseSharedExtendedConnection()
    • setConnectionAutoCommit

      public void setConnectionAutoCommit(boolean autoCommit)
      カーソルが使用する接続に対して "autoCommit" をオーバーライドするかどうかを設定します。設定されていない場合は、接続 / データソースのデフォルト構成がデフォルトになります。
      パラメーター:
      autoCommit - Connection.setAutoCommit(boolean)SE に使用される値。
      導入:
      4.0
    • getSql

      public abstract StringSE getSql()
    • doClose

      protected void doClose() throws ExceptionSE
      カーソルとデータベース接続を閉じます。cleanupOnClose を呼び出して、サブクラスが割り当てたリソースをクリーンアップできるようにします。
      次で指定:
      クラス AbstractItemCountingItemStreamItemReader<T>doClose 
      例外:
      ExceptionSE - サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします
    • cleanupOnClose

      protected abstract void cleanupOnClose(ConnectionSE connection) throws ExceptionSE
      リソースをクリーンアップします。
      パラメーター:
      connection - データベースへ
      例外:
      ExceptionSE - リソースをクリーンアップできない場合
    • doOpen

      protected void doOpen() throws ExceptionSE
      ステートメントを実行してカーソルを開きます。
      次で指定:
      クラス AbstractItemCountingItemStreamItemReader<T>doOpen 
      例外:
      ExceptionSE - サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします
    • initializeConnection

      protected void initializeConnection()
    • openCursor

      protected abstract void openCursor(ConnectionSE con)
    • doRead

      @Nullable protected T doRead() throws ExceptionSE
      次の行を読み取って項目にマップし、setVerifyCursorPosition(boolean) が true の場合はカーソル位置を確認します。
      次で指定:
      クラス AbstractItemCountingItemStreamItemReader<T>doRead 
      戻り値:
      データソースが使い果たされた場合、アイテムまたは null 
      例外:
      ExceptionSE - サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします
    • readCursor

      @Nullable protected abstract T readCursor(ResultSetSE rs, int currentRow) throws SQLExceptionSE
      カーソルを読み取り、このリーダーが返すオブジェクトの型にマッピングします。このメソッドはサブクラスでオーバーライドする必要があります。
      パラメーター:
      rs - 現在の結果セット
      currentRow - 結果セットの現在の位置
      戻り値:
      カーソル位置のマップされたオブジェクト
      例外:
      SQLExceptionSE - 現在の結果セットとの相互作用が失敗した場合
    • jumpToItem

      protected void jumpToItem(int itemIndex) throws ExceptionSE
      可能な場合は ResultSet.absolute(int)SE を使用し、そうでない場合は ResultSet.next() を呼び出してスクロールします。
      オーバーライド:
      クラス AbstractItemCountingItemStreamItemReader<T>jumpToItem 
      パラメーター:
      itemIndex - ジャンプするアイテムのインデックス(0 ベース)。
      例外:
      ExceptionSE - サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします