[英]MyBatis 3.2.7 bulky BATCH insert is blocked
我遇到一个问题,我试图将大约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条记录,将它们插入,但如果其中一个失败则回滚所有批处理,并且仅在成功插入所有批处理时才提交?
还是有其他替代方法?
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>
感谢您的反馈。
是的,您可以启动事务并在发生错误时将其回滚,或者在没有错误的情况下将其提交。 有许多方法可以管理Java应用程序中的事务
由于使用的是myBatis,因此可以查看SqlMapTransactionManager
。
我在路由中使用了骆驼EIP拆分器,并将查询绑定在事务中。 可以在http://camel.465427.n5.nabble.com/Camel-Mybatis-2-13-1-BATCH-of-10-000-records-tt5756211.html中找到更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.