在cftransaction中写入查询/语句的数量是否有限制?

7

今天在修复一些现有代码中的错误时,我发现了一个奇怪的错误。

分支目标偏移量对于短跳转太大

搜索后发现这与Java字节码转换有关。以下是我找到的链接:

在我的情况下,cftransaction包含约870个语句,并且它正在正常工作。但是当我向此事务添加两个更多的查询时,即使在cftransaction内添加一行代码,我现在也会收到此错误。目前,我无法将任何现有的cfquery移出cftransaction。

以下是代码的整体结构:

<cftransaction action="begin">

   <cfif URL.action eq 'add'>
         Around 200 lines of queries/statements
   <cfelseif URL.action eq 'edit'>
        Around 200 lines of queries/statements
   </cfif>

    <cfif URL.action eq 'add' or URL.action 'edit'>
          Around 450 lines of queries/statements
    </cfif>

</cftransaction>

有没有什么解决此问题的方法?

你可以把所有的 SQL 代码都移动到数据库存储过程中。 - Dan Bracuk
1
你确定事务是原因吗?其中一个线程提到事务并没有涉及,将事物拆分成更小的函数/组件解决了问题。一些测试点:A)如果您暂时删除事务,它是否有效?B)如果您将代码重新排列为较小的函数(或CFC,如果需要),然后从事务中调用这些函数,它是否有效?C)话虽如此,对于一个查询来说,这听起来像是很多SQL。(也就是说,在我看来,复杂的SQL逻辑最好打包在存储过程中,而不是查询中。) - Leigh
@Leigh:A)当我移除事务时,它可以正常工作。B)是的,我尝试过了,它可以工作。C)我也计划将其打包到存储过程中,但问题是这需要很多时间/精力/测试,而且我不确定客户是否准备好了,因此正在寻找小的解决方法。 - Deepak Kumar Padhy
1
@DeepakKumarPadhy - 很有趣。听起来B选项现在是个不错的选择。不过,从长远来看,对于复杂的SQL来说,存储过程通常是我个人认为最好的选择。 - Leigh
1个回答

3
分支偏移与模块/函数的大小有关,也可能由于大量条件代码块(如cfif/cfelsecfswitch)而引起。
从技术上讲,我不确定在cftransaciton块中放置的查询数量是否有限制。这与从CF8迁移到CF9的代码迁移无关,但与您在条件块内的代码长度有关。
我建议将函数拆分,并尝试将每个大型条件块作为单独的函数放入cfc中:
 <cffunction name="myFunc1">
    <cftransaction action="begin">
      <cfif URL.action eq 'add'>
        <!--- function call with your xxx lines of queries/statements --->
        <cfinvoke component="MyCfc" method="firstQueryBlock" result="result1">
      <cfelseif URL.action eq 'edit'>
        <!--- second function call with your yyy lines of queries/statements --->
        <cfinvoke component="MyCfc" method="secondQueryBlock" result="result2">
      </cfif>

       <cfif URL.action eq 'add' or URL.action 'edit'>
            <!--- third function call with your zzz lines of queries/statements --->
            <cfinvoke component="MyCfc" method="thirdQueryBlock" result="result3">
       </cfif>
    </cftransaction>
 </cffunction>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接