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 と共に使用する場合、カーソル位置の検証に使用される ResultSet.getRow()
呼び出しは 'TYPE_FORWARD_ONLY' 結果セットでは使用できないため、setVerifyCursorPosition(boolean)
は false
である必要があります。
修飾子と型 | フィールドと説明 |
---|---|
protected org.apache.commons.logging.Log | log サブクラスで利用可能なロガー |
protected java.sql.ResultSet | rs |
static int | VALUE_NOT_SET |
コンストラクターと説明 |
---|
AbstractCursorItemReader() |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() 必須プロパティが設定されていることを確認します。 |
protected void | applyStatementSettings(java.sql.PreparedStatement stmt) 指定された JDBC ステートメント(または PreparedStatement または CallableStatement)を準備し、フェッチサイズ、最大行、クエリタイムアウトなどのステートメント設定を適用します。 |
protected abstract void | cleanupOnClose() 使用すべきではありません。 このメソッドは cleanupOnClose(java.sql.Connection) を優先して非推奨になり、将来のリリースで削除される予定です。 |
protected abstract void | cleanupOnClose(java.sql.Connection connection) リソースをクリーンアップします。 |
protected void | doClose() カーソルとデータベース接続を閉じます。 |
protected void | doOpen() ステートメントを実行してカーソルを開きます。 |
protected T | doRead() 次の行を読み取って項目にマップし、 setVerifyCursorPosition(boolean) が true の場合はカーソル位置を確認します。 |
javax.sql.DataSource | getDataSource() データソースのパブリック getter。 |
protected org.springframework.jdbc.support.SQLExceptionTranslator | getExceptionTranslator() 何も設定されていない場合、指定された DataSource のデフォルトの SQLErrorCodeSQLExceptionTranslator を作成します。 |
abstract java.lang.String | getSql() |
protected void | handleWarnings(java.sql.Statement statement) 警告を無視していない場合は SQLWarningException をスローし、それ以外の場合は(デバッグレベルで)警告をログに記録します。 |
protected void | initializeConnection() |
boolean | isUseSharedExtendedConnection() |
protected void | jumpToItem(int itemIndex) 可能な場合は ResultSet.absolute(int) を使用します。それ以外の場合は ResultSet.next() を呼び出してスクロールします。 |
protected abstract void | openCursor(java.sql.Connection con) |
protected abstract T | readCursor(java.sql.ResultSet rs, int currentRow) カーソルを読み取り、このリーダーが返すオブジェクトの型にマッピングします。 |
void | setConnectionAutoCommit(boolean autoCommit) カーソルが使用する接続に対して "autoCommit" をオーバーライドするかどうかを設定します。 |
void | setDataSource(javax.sql.DataSource dataSource) インジェクション用のデータソース用のパブリック setter。 |
void | setDriverSupportsAbsolute(boolean driverSupportsAbsolute) JDBC ドライバーが ResultSet の絶対行の設定をサポートするかどうかを示します。 |
void | setFetchSize(int fetchSize) この ResultSet オブジェクトにさらに行が必要な場合に、データベースからフェッチする行数に関するヒントを JDBC ドライバーに提供します。 |
void | setIgnoreWarnings(boolean ignoreWarnings) SQLWarnings を無視するか(ログのみ)、例外をスローするかを設定します。 |
void | setMaxRows(int maxRows) 任意の ResultSet オブジェクトが含むことができる行の最大数の制限を、指定された数に設定します。 |
void | setQueryTimeout(int queryTimeout) ドライバーが Statement オブジェクトの実行を待機する秒数を、指定された秒数に設定します。 |
void | setUseSharedExtendedConnection(boolean useSharedExtendedConnection) カーソルに使用される接続を他のすべての処理で使用する必要があるかどうかを示し、同じトランザクションを共有します。 |
void | setVerifyCursorPosition(boolean verifyCursorPosition) 現在の行が RowMapper または RowCallbackHandler によって処理された後のカーソル位置の検証を許可します。 |
protected org.springframework.dao.DataAccessException | translateSqlException(java.lang.String task, java.lang.String sql, java.sql.SQLException ex) |
close, getCurrentItemCount, isSaveState, open, read, setCurrentItemCount, setMaxItemCount, setSaveState, update
getExecutionContextKey, setExecutionContextName, setName
protected final org.apache.commons.logging.Log log
public static final int VALUE_NOT_SET
protected java.sql.ResultSet rs
public void afterPropertiesSet() throws java.lang.Exception
org.springframework.beans.factory.InitializingBean
の afterPropertiesSet
java.lang.IllegalArgumentException
- データソースまたは SQL プロパティが設定されていない場合。java.lang.Exception
public void setDataSource(javax.sql.DataSource dataSource)
dataSource
- 使用する DataSource
public javax.sql.DataSource getDataSource()
protected void applyStatementSettings(java.sql.PreparedStatement stmt) throws java.sql.SQLException
stmt
- 構成する PreparedStatement
java.sql.SQLException
- 提供された stmt との対話が失敗した場合 setFetchSize(int)
, setMaxRows(int)
, setQueryTimeout(int)
protected org.springframework.jdbc.support.SQLExceptionTranslator getExceptionTranslator()
protected org.springframework.dao.DataAccessException translateSqlException(java.lang.String task, java.lang.String sql, java.sql.SQLException ex)
protected void handleWarnings(java.sql.Statement statement) throws org.springframework.jdbc.SQLWarningException, java.sql.SQLException
statement
- 警告がある場合、警告を取得する現在のステートメント。java.sql.SQLException
- 指定されたステートメントとの対話が失敗した場合。org.springframework.jdbc.SQLWarningException
SQLWarningException
public void setFetchSize(int fetchSize)
ResultSet
オブジェクトにさらに行が必要な場合に、データベースからフェッチする行数に関するヒントを JDBC ドライバーに提供します。指定されたフェッチサイズがゼロの場合、JDBC ドライバーは値を無視します。fetchSize
- 取得する行数 ResultSet.setFetchSize(int)
public void setMaxRows(int maxRows)
ResultSet
オブジェクトが含むことができる行の最大数の制限を、指定された数に設定します。maxRows
- 新しい最大行数の制限。ゼロは制限がないことを意味します Statement.setMaxRows(int)
public void setQueryTimeout(int queryTimeout)
Statement
オブジェクトの実行を待機する秒数を、指定された秒数に設定します。制限を超えると、SQLException
がスローされます。queryTimeout
- seconds 新しいクエリタイムアウト制限(秒単位)。ゼロは制限がないことを意味します Statement.setQueryTimeout(int)
public void setIgnoreWarnings(boolean ignoreWarnings)
ignoreWarnings
- TRUE の場合、警告は無視されます public void setVerifyCursorPosition(boolean verifyCursorPosition)
verifyCursorPosition
- true の場合、カーソル位置が検証されます public void setDriverSupportsAbsolute(boolean driverSupportsAbsolute)
ResultSet
の絶対行の設定をサポートするかどうかを示します。これは、ResultSet.absolute() をサポートする JDBC ドライバーの true
に設定することをお勧めします。これは、特に大きなデータセットでの作業中にステップが失敗した場合にパフォーマンスが向上する可能性があるためです。driverSupportsAbsolute
- デフォルトで false
ResultSet.absolute(int)
public void setUseSharedExtendedConnection(boolean useSharedExtendedConnection)
ExtendedConnectionDataSourceProxy
にラップして、各コミット後に接続が閉じられて解放されないようにする必要があります。このオプションを true
に設定すると、カーソルを開くために使用されるステートメントは、"READ_ONLY" と "HOLD_CURSORS_OVER_COMMIT" の両方のオプションで作成されます。これにより、トランザクションの開始およびステップ処理で実行されたコミットの上でカーソルを開いたままにすることができます。この機能を使用するには、これをサポートするデータベースと、JDBC 3.0 以降をサポートする JDBC ドライバーが必要です。useSharedExtendedConnection
- デフォルトで false
public boolean isUseSharedExtendedConnection()
public void setConnectionAutoCommit(boolean autoCommit)
autoCommit
- Connection.setAutoCommit(boolean)
に使用される値。public abstract java.lang.String getSql()
protected void doClose() throws java.lang.Exception
AbstractItemCountingItemStreamItemReader<T>
の doClose
java.lang.Exception
- サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします @Deprecated protected abstract void cleanupOnClose() throws java.lang.Exception
cleanupOnClose(java.sql.Connection)
を優先して非推奨になり、将来のリリースで削除される予定です。java.lang.Exception
- リソースをクリーンアップできない場合 protected abstract void cleanupOnClose(java.sql.Connection connection) throws java.lang.Exception
connection
- データベースへ java.lang.Exception
- リソースをクリーンアップできない場合 protected void doOpen() throws java.lang.Exception
AbstractItemCountingItemStreamItemReader<T>
の doOpen
java.lang.Exception
- サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします protected void initializeConnection()
protected abstract void openCursor(java.sql.Connection con)
@Nullable protected T doRead() throws java.lang.Exception
setVerifyCursorPosition(boolean)
が true の場合はカーソル位置を確認します。AbstractItemCountingItemStreamItemReader<T>
の doRead
null
java.lang.Exception
- サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします @Nullable protected abstract T readCursor(java.sql.ResultSet rs, int currentRow) throws java.sql.SQLException
rs
- 現在の結果セット currentRow
- 結果セットの現在の位置 java.sql.SQLException
- 現在の結果セットとの相互作用が失敗した場合 protected void jumpToItem(int itemIndex) throws java.lang.Exception
ResultSet.absolute(int)
を使用します。それ以外の場合は ResultSet.next()
を呼び出してスクロールします。AbstractItemCountingItemStreamItemReader<T>
の jumpToItem
itemIndex
- ジャンプするアイテムのインデックス(0 ベース)。java.lang.Exception
- サブクラスがフレームワークによる解釈のためにチェック済み例外をスローできるようにします