首先,我不能使用聲明@Transactional
的方法,因爲應用程序具有多個JDBC數據源,我不想對細節感到厭煩,但可以說DAO方法已將正確的數據源傳遞給執行邏輯。所有JDBC數據源都具有相同的模式,因爲我爲ERP系統公開了其餘服務。如何獲取spring_jdbcTemplate以read_uncommitted?
由於這個遺留系統有很多長期鎖定記錄,我沒有控制,所以我想髒讀。
使用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,第三版,它解釋了我所做的事情,儘管關於事務的章節繼續使用帶註釋的聲明性事務,但如前所述,我不能將其用作我的DAO需要根據提供的參數在運行時確定使用哪個數據源,在我的情況下是國家代碼。
任何幫助將不勝感激。
這是否意味着我需要爲每個數據庫和每個隔離配置多個txTemplate?所以如果我想要6個數據庫的可寫隔離和只讀髒隔離,我需要12個txTemplates? – 2013-08-22 03:57:54
要麼這樣做,要麼在需要時自己構建它們,這將要求您傳入事務管理器並相應地設置配置。我想最好的解決方案是通過使用AbstractRoutingDataSource這種方式來使用Spring聲明式transactionmanagement(並在運行時清理代碼)。 – 2013-08-22 11:09:44