我遇到了一个问题,我试图将大约10,000条记录的BATCH
插入到13列的Oracle 11g表中。 Actually this is blocked if I try more than 1000 records.
此外,500条记录的BATCH插入的细粒度测试也太慢了。
由于ORA-4031错误,BATCH正在数据库服务器上生成大量跟踪文件。在每个会话中运行的SQL语句超过80,000行,作为42,000个绑定变量的输入。
驱动程序:oracle.jdbc.driver.OracleDriver
我试图满足要求:如果插入的任何数据无效,我必须回滚。
我的问题是:
有没有办法告诉MyBatis将传入的大批量分成小批量,每个10个记录,插入它们但是如果其中一个批次失败则回滚所有批次并仅在所有批次成功插入时提交?“ p>
或者有替代方法吗?
Below is the xml mapping for the insert:
<insert id="insertToTable" parameterType="java.util.List">
INSERT ALL
<foreach item="line" collection="list" >
<foreach item="lineItem"
collection="line.entrySet()" open="" close="" separator="">
into
TABLE_TEST_T
(col1, col2, col3, col4, col5,
col6, col7, col8, col9, col10,
col11, col12, col13)
values(
<!-- #{lineItem.item1, jdbcType=DATE}, -->
#{lineItem.item1, jdbcType=VARCHAR},
#{lineItem.item2, jdbcType=VARCHAR},
#{lineItem.item3, jdbcType=VARCHAR},
#{lineItem.item4, jdbcType=NUMERIC},
#{lineItem.item5, jdbcType=NUMERIC},
#{lineItem.item6, jdbcType=NUMERIC},
#{lineItem.item7, jdbcType=NUMERIC},
#{lineItem.item8, jdbcType=NUMERIC},
#{lineItem.item9, jdbcType=NUMERIC},
#{lineItem.item10, jdbcType=NUMERIC},
#{lineItem.item11, jdbcType=NUMERIC},
#{lineItem.item12, jdbcType=NUMERIC},
#{lineItem.item13, jdbcType=NUMERIC}
)
</foreach>
</foreach>
SELECT * FROM dual
</insert>
感谢您的反馈。
答案 0 :(得分:0)
是的,您可以启动事务并在发生错误时将其回滚,或者如果没有错误则提交它。 有许多方法可以在Java应用程序中管理事务
由于您使用的是myBatis,因此可以查看SqlMapTransactionManager
。
答案 1 :(得分:0)
我在路线中使用了骆驼EIP Splitter并将查询绑定在一个事务中。更多细节可以在 http://camel.465427.n5.nabble.com/Camel-Mybatis-2-13-1-BATCH-of-10-000-records-tt5756211.html