JdbcCursorItemReader (データベースの Request テーブルからデータを読み取る) である別のリーダーのデータを読み取り、特定のサイズのリストを作成し、アイテムのリストを返すカスタム Item リーダーがあります。
リクエスト テーブルには、ID、タイプ、およびステータスがあります。
リーダーによって読み取られた ID のステータスを PROCESSING のようなものに更新して、要求 ID がバッチで処理されていることをアプリケーションが表示できるようにしたいと考えています。また、ビジネス例外がある場合にアイテムを処理しているときに、特定のステータスの ID のテーブルを更新したいと考えています。
アイテムが読み取られて処理されている場合、それらのリクエストのステータスが REQUESTED ではなく PROCESSING と表示されるように、ステータス更新部分を別のトランザクションにする必要がありました。
リクエストのステータスを更新するメソッドで @Transactional(propagation=Propagation.REQUIRES_NE W) を使用しています。
Spring バッチ テーブルとアプリケーション固有のテーブルに、別々のデータ ソースとトランザクション マネージャーを使用しています。
JDBC テンプレートを使用してステータスを更新しています。
アプリケーション データ ソースに javax.sql.DataSource を使用し、アプリケーション トランザクション マネージャに JpaTransactionManager と HibernateJpaVendorAdapter を使用しています。
データベースはオラクルです。
デバッグ ログをオンにすると、メイン トランザクションが中断され、更新ステータスがリーダーから呼び出されたときに新しいトランザクションが使用され、コミットされ、中断されたトランザクションが再開されることがわかります。しかし、データベースに変更が見られません。トランザクション ログにはコミット済みと表示されますが、データベースに変更が見られません。バッチが完了すると、データベース内の要求テーブルに変更が表示されます。何か不足していますか?
ログは次のとおりです。
15:40:26 [main] DEBUG o.s.t.a.AnnotationTransactionAttributeSource - Adding transactional method 'updateStatus' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@36dd518b] for JPA transaction
15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - begin
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtaining JDBC connection
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtained JDBC connection
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - initial autocommit status: true
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - disabling autocommit
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@3a7b058e]
15:40:48 [main] INFO c.c.c.f.c.a.b.RequestReader - Reading...
15:40:48 [main] INFO c.c.c.f.c.a.b.SecuritiesReader - End of Input Data from request id ItemReader
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Creating new transaction with name [*.updateStatus]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@628b6e47] for JPA transaction
15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - begin
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtaining JDBC connection
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtained JDBC connection
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - initial autocommit status: true
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - disabling autocommit
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@88f431d]
15:40:48 [main] INFO c.c.c.f.c.a.b.s.i.InstrumentIdentifierServiceImpl - Updating the status of Request Id's
15:40:48 [main] DEBUG org.hibernate.SQL - UPDATE REQUEST SET STATUS = ? , MESSAGE = ? WHERE ID = ?
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Initiating transaction commit
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@628b6e47]
15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - committing
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - committed JDBC Connection
15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - re-enabling autocommit
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@628b6e47] after transaction
15:40:48 [main] DEBUG o.s.o.j.EntityManagerFactoryUtils - Closing JPA EntityManager
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection
15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Released JDBC connection
15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Resuming suspended transaction after completion of inner transaction
ありがとうございました!