2017-05-23 28 views
2

私の要件は、データベースからデータを読み込み、それをバイトに変換し、Blob列の別のデータベース(Oracle)にストリームすることです。Spring Batchアプリケーションでバイナリ(Blob)データを処理する方法

Oracleでは、Blob列にストリームするためにJDBC自動コミットを無効にし、終了時にConnection#Commitを呼び出す必要があります。

私は現在3つのステップを持っています。

ステップ1(タスクレット): これには2つのSQLクエリがあります。二つ目は、私はまた、自動コミット

ステップ2(チャック) を無効にするために、データソースからの接続オブジェクトを取得BLOBロケータ(SELECT payload AS payload FROM DATABASEUSER.TABLENAME WHERE PrimaryKey = ? FOR UPDATE

を返すカラム(UPDATE DATABASEUSER.TABLENAME SET payload = empty_blob() WHERE PrimaryKey= ?

を初期化する一つの私は一般的な方法でソースDBからデータを読み込むIteamReaderと、行をCSV形式にバイト単位で変換するProcessorを持っています。次に、Blob列にデータをストリーミングするカスタムItemWriterがあります。

手順3(タスクレット) これは、クリーンアップして接続をコミットするときです。

質問1:これは正しい戦略ですか?私はちょっとわかりませんので、どんな方向にも感謝します

+0

いいえ。ステップ間でトランザクションを保持することはできません。各ステップはそれぞれ独自にコミットする必要があります。 –

+0

@DeanClark私はそれを解決しました、ありがとう。 –

答えて

0

私はそれを解決しました。

すべての手順でResourcelessTransactionManagerトランザクションマネージャを使用しました。ステップ1では、データソースからの接続を取得し、自動コミットを無効にして、最後のステップでコミットを呼び出します。私はすべてのステップで同じ接続を使用します。

関連する問題