我制作了一个这样的映射器XML文件:
<update id="feeCalculation" parameterType="map">
declare @cnt int
insert into #tempA
select ... from ... where ...
insert into #tempA
select ... from ... where ...
insert into #tempB
select ... from ... where ...
insert into #tempB
select ... from ... where ...
insert into #tempC ...
select @cnt=count(*) from #tempA where ...
if @cnt > 0
begin
insert into #tempD ...
update #tempA set...
update #tempA set...
update #tempB set...
update #tempD set...
end
update #tempC set...
</update>
因为计算涉及使用多个会话临时表的许多步骤,所以我将它们全部放在一个事务中。结果将在#tempC和#tempD中,将在下次调用时获取。
使用“正常”数据大小,只需一次调用'feeCalculation()'即可。但是当数据大小增加时,我遇到了一个错误 - 它在中间的某个地方失败了所以它没有抛出任何异常就回滚了(我已经尝试{} catch {}。当我将单个呼叫分成两个呼叫时,它起作用了:
<update id="feeCalculation1" parameterType="map">
declare @cnt int
insert into #tempA
select ... from ... where ...
insert into #tempA
select ... from ... where ...
insert into #tempB
select ... from ... where ...
insert into #tempB
select ... from ... where ...
insert into #tempC ...
</update>
<update id="feeCalculation2" parameterType="map">
select @cnt=count(*) from #tempA where ...
if @cnt > 0
begin
insert into #tempD ...
update #tempA set...
update #tempA set...
update #tempB set...
update #tempD set...
end
update #tempC set...
</update>
不知何故,它似乎是一个事务内存问题。 这就像是在猜测我使用XML语句,如果它是由存储过程完成的话你不会担心,只是按正确的顺序堆积所有的SQL。
在Java / myBatis中处理它的最佳方法是什么?反正有没有抓住这种例外?
非常感谢您的时间和帮助!
Glander
答案 0 :(得分:0)
通过将设置添加到myBatis Config.xml而不更改代码来解决问题,但我仍然无法完全理解原因。
<settings>
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
Glander