2012-07-11 54 views
1

目前我們的應用程序使用Spring,SimpleJdbcTemplate & MySQL。在Spring + mysql中使用ACID屬性批量更新

使用的數據源是org.apache.commons.dbcp.BasicDataSource,其url屬性爲「rewriteBatchedStatements = true」。

在使用SimpleJdbcTemplate.batchUpdate(List<Object[]>)進行批量插入的過程中,在輸入批處理中會有重複的記錄(基於我們正在剔除的表的主鍵)。

在重複記錄的情況是有可能

1)將所有的非重複記錄,並獲得有關成功的插入次數的反應呢?

OR

2)完全回滾batchInsert,沒有記錄應插入?

我們能夠使用mysql的「INSERT IGNORE」部分實現第一個需求。但SimpleJdbcTemplate.batchUpdate()返回每個記錄更新(不能只捕獲插入的記錄計數忽略重複)

而要實現第二個要求,我們必須關閉「rewriteBatchedStatements」。但是這個參數在性能測試之後已經很好的調整了。所以我們不能將其設置爲「false」。

在第一行中提到的組件的約束範圍內,是否可以實現以上兩種情況之一?

我是新來的spring和jdbc世界,所以詳細的解釋會幫助我們更好。 謝謝

回答

1

1)插入所有非重複記錄,並獲得有關成功插入數量的響應?

=>那麼你可以,插入所有non.duplicate記錄,並獲得響應。 batchUpdate()返回int[]即表示批量中每個更新(插入/更新)影響的行數的整數數組。

2)完全回滾batchInsert不應插入記錄?

=>由於batchInsert將在單個事務中,所有記錄都將被插入或者沒有記錄被插入。如果事務被提交,所有記錄將被插入。如果發生任何異常,如果您使用彈簧交易管理(使用@Transactional註釋或spring aop based tx advice),交易將自動回滾。在這裏確定,你設置了BasicDataSource.defaultAutoCommit = false