2015-06-24 13 views
7

Oggi mentre risolvo bug in qualche codice esistente ho trovato uno strano errore.Esiste qualche limitazione con le query/dichiarazioni numeriche che possiamo scrivere all'interno di cftransaction?

obiettivo Branch compensato troppo grande per breve

Dopo la ricerca ho scoperto che si tratta di qualcosa a che fare con la conversione di codice Java byte. Ecco i link che ho trovato:

Nel mio caso cftransaction contiene circa 870 dichiarazioni e sta lavorando bene. Ma ho bisogno di aggiungere altre 2 query a questa transazione. Ora ricevo questo errore quando aggiungo anche una sola riga di codice all'interno di cftransaction. Al momento non riesco a spostare nessuna delle esistenti cfquery da cftransaction. ci

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

è alcuna soluzione per risolvere questo problema:

Ecco la struttura complessiva del codice?

+0

Si può sempre spostare tutto ciò che SQL per stored procedure del database. –

+1

Sei sicuro che la transazione sia la causa? Uno dei thread menzionati le transazioni erano * non * coinvolti e la suddivisione di elementi in funzioni/componenti più piccoli risolveva il problema. Alcune cose da testare A) Funziona se rimuovi temporaneamente la transazione? b) Funziona se il codice è stato riorganizzato in funzioni più piccole (o cfc se necessario), quindi chiama quelli da una transazione? c) Detto questo, sembra un sacco di SQL per una query. (Ciò detto, la logica sql complessa IMO è meglio impacchettata in una stored procedure piuttosto che in una query.) – Leigh

+0

@Leigh: A) Sì, funziona correttamente quando ho rimosso la transazione. B) Sì, ho provato a farlo funzionare. C) Sto anche pianificando di comprimerlo all'interno di una procedura memorizzata, ma la cosa è che richiede molto tempo/impegno/test e non sono sicuro che il client sia pronto o meno, ecco perché si cercano soluzioni alternative. –

risposta

2

L'offset derivato ha a che fare con le dimensioni del modulo/funzione. Può anche essere causato da un grande blocco di codice condizionale di cfif/cfelse o cfswitch.

Tecnicamente, non sono sicuro se c'è un limite sul no. di domande che puoi inserire nel blocco cftransaciton. Non ha nulla a che fare con la migrazione del codice da CF8 a CF9 ma la lunghezza del codice all'interno di blocchi condizionali.

Vorrei dividere la funzione e cercare di mettere la ciascuna delle grandi blocchi condizionali dimensioni come una funzione separata all'interno del 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>