2015-06-24 3 views
7

Heute habe ich beim Beheben von Fehlern in einem vorhandenen Code einen seltsamen Fehler gefunden.Gibt es irgendeine Beschränkung mit Anzahl Abfragen/Anweisungen, die wir in cftransaction schreiben können?

Ast Ziel zu groß Offset für kurze

Nach der Suche fand ich, dass es etwas ist, mit Java-Byte-Code-Konvertierung zu tun. Hier sind die Links, die ich gefunden:

In meinem Fall cftransaction enthält rund 870 Aussagen und es funktioniert gut. Aber ich muss dieser Transaktion zwei weitere Abfragen hinzufügen. Jetzt bekomme ich diesen Fehler, wenn ich gerade eine Zeile Code in cftransaction hinzufüge. Derzeit kann ich keine der bestehenden cfquery aus der ctransaction entfernen.

Hier ist die Gesamtstruktur des Code:

<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> 

Gibt es eine Abhilfe Um dieses Problem zu beheben?

+0

Sie immer, dass SQL alle Datenbank gespeicherte Prozeduren bewegen kann. –

+1

Sind Sie sicher, dass die Transaktion die Ursache ist? Eine der genannten Threads war * nicht * involviert und die Aufteilung in kleinere Funktionen/Komponenten löste das Problem. Einige Dinge zum Testen A) Funktioniert es, wenn Sie die Transaktion vorübergehend entfernen? b) Funktioniert es, wenn Sie den Code in kleinere Funktionen umwandeln (oder, wenn nötig, cfc), diese dann innerhalb einer Transaktion aufrufen? c) Nachdem das alles gesagt wurde, klingt es für eine Abfrage wie viel SQL. (Das heißt, IMO komplexe SQL-Logik ist besser verpackt in einer gespeicherten Prozedur als eine Abfrage.) – Leigh

+0

@Leigh: A) Ja, es funktioniert gut, wenn ich die Transaktion entfernt.B. Ja habe ich versucht, seine Arbeit. C) Ich plane auch, es in eine gespeicherte Prozedur zu packen, aber die Sache erfordert viel Zeit/Aufwand/Tests und ich bin mir nicht sicher, ob der Client dafür bereit sein wird oder nicht, deshalb suchen Sie nach kleinen Problemumgehungen. –

Antwort

2

Der Verzweigungsversatz hängt mit der Größe des Moduls/der Funktion zusammen. Es kann auch aufgrund eines großen bedingten Codeblocks von cfif/cfelse oder cfswitch verursacht werden.

Technisch bin ich nicht sicher, ob es eine Kappe auf der Nr. Gibt. von Abfragen können Sie in den cftransaciton Block setzen. Es hat nichts mit der Code-Migration von CF8 zu CF9 zu tun, sondern mit der Länge Ihres Codes in bedingten Blöcken.

Ich würde die Funktion teilen will und versuchen, die jeden der großen Größe bedingten Blöcke als separate Funktion innerhalb des cfc zu setzen:

<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> 
Verwandte Themen