まず、アプリケーションには複数のJDBCデータソースがあるため、宣言型@Transactional
アプローチを使用できません。詳細に飽きたくありませんが、DAOメソッドに正しいデータソースが渡されてロジックが実行されると言えば十分です。 。すべてのJDBCデータソースは同じスキーマを持っており、ERPシステムのRESTサービスを公開しているため、それらは分離されています。
このレガシーシステムのために、私が制御できない長期間有効なロックされたレコードがたくさんあるので、ダーティリードが必要です。
JDBCを使用して、次のことを実行します。
private Customer getCustomer(DataSource ds, String id) {
Customer c = null;
PreparedStatement stmt = null;
Connection con = null;
try {
con = ds.getConnection();
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
stmt = con.prepareStatement(SELECT_CUSTOMER);
stmt.setString(1, id);
ResultSet res = stmt.executeQuery();
c = buildCustomer(res);
} catch (SQLException ex) {
// log errors
} finally {
// Close resources
}
return c;
}
さて、ボイラープレートがたくさんあります、私は知っています。JdbcTemplate
春を使っているので試してみました。
JdbcTemplateを使用する
private Customer getCustomer(JdbcTemplate t, String id) {
return t.queryForObject(SELECT_CUSTOMER, new CustomerRowMapper(), id);
}
はるかに優れていますが、デフォルトのトランザクション分離を使用しています。どういうわけかこれを変更する必要があります。だから私はを使用することを考えましたTransactionTemplate
。
private Customer getCustomer(final TransactionTemplate tt,
final JdbcTemplate t,
final String id) {
return tt.execute(new TransactionCallback<Customer>() {
@Override
public Customer doInTransaction(TransactionStatus ts) {
return t.queryForObject(SELECT_CUSTOMER, new CustomerRowMapper(), id);
}
});
}
しかし、ここでトランザクション分離を設定するにはどうすればよいですか?コールバックまたはこれを行うためのどこにもそれを見つけることができませんTransactionTemplate
。
Spring in Action、Third Editionを読んでいますが、トランザクションに関する章では引き続きアノテーション付きの宣言型トランザクションを使用していますが、前述のように、DAOがで決定する必要があるため、これを使用することはできません。提供された引数(私の場合は国コード)に基づいてデータソースが使用するランタイム。
どんな助けでも大歓迎です。