R: R: Elaborare query con molti record
"Puglia Marco" <[email protected]>
| Newsgroups | gmane.comp.cms.cold-fusion.devel.italian |
|---|---|
| Message-ID | <28CCFBE04D70AC47A1CE899BDF82809F01A1494D@bera-mail.businesse.local> |
Niente da fare… ho provato a mettere dei puntini all’interno di un loop di 300.000 record con un <cfflush> impostato sui 10 byte e mi visualizza tutto solo ad elaborazione finita… non capisco… vi incollo il codice.
<cfloop query="elenco">
<cfset midean13=elenco.codiceean>
<cfquery name="trova" datasource="liberamente">
select * from libridb where idean13='#midean13#'
</cfquery>
<cfif trova.recordcount eq 0>
<cfoutput>#midean13#</cfoutput> non trovato (da aggiungere)<br>
</cfif>
...
<cfflush interval="10">
</cfloop>
Dove sbaglio?
================================
Marco Puglia
Project Manager
Business-e S.r.l. <http://www.business-e.it/> (an Itway Group Company)
Via F.lli Lumière, 65 - 48010 Ravenna
Tel. +39 0544.460413 - Fax +39 0544.272297
Cell. 348 4759233
Italy, France, Spain, Portugal, Greece, Turkey
Ravenna, Milano, Trento, Bari, Massa, Roma
Paris, Barcelona, Madrid, Lisboa, Athina, Istanbul, Ankara
================================
Da: [email protected] [mailto:[email protected]] Per conto di Ciro Bernini
Inviato: lunedì 7 maggio 2012 08:33
A: [email protected]
Oggetto: Re: R: Elaborare query con molti record
Se usi cfflush senza altri parametri, cf invia al browser quello che ha elaborato fino ad incontrare il tag <cfflush>.
Se metti l'opzione interval=k CF invia al browser i dati ogni qualvolta genera k bytes di output; se noon usi cfflush CF invia al browser tutto SOLO quando ha finito l'elaborazione, per cui se è una pagina da 100 k cfflush non serve a nulla, ma se ha migliaia di record da elaborare e vuoi avere lo stato di avanzamento a mano a mano che elabora la pagina metti il cfflush all'interno del loop.
Se vuoi che mandi verso il browser dei dati "ogni tanto" a prescindere dall'elaborazione del singolo ciclo, allora aggiungi l'opzione interval=
Ricorda anche che se la pagina impiega tanto ad elaborare di aggiungere il cfsetting settimeout ad un valore congruo.
Tutto questo perchéproprio perchè CF invia di default il risultato alla fine dell'elaborazione, una pagina che impiegi un tempo di elaborazione maggiore del tempo di timeout del webserver ti porterebbe ad avere che sul browser ti arriva una pagina di timeout anziché la pagina elaborata.
Per evitare ciò usi cfflush per far si che arrivi al webserver, e quindi al browser richiedente la pagina, una porzione di elaborazione che ha il duplice scopo di far notare un qualche avanzamento della pagina e di tenere attiva la connessione CF -> Webserver -> browser
Quindi, per ridponderti, con cfflush senza parametri presenta l'utput generato fino a quel momento (non ogni tot seondi), se metti il parametro interval ti invia l'elaborato ogni tot byte, se non lo usi affatto l'invia alla fine dell'elaborazione dell'intera pagina.
<CiBerFiduciaInCF>
Aggiungo che CF ha SEMPRE voglia di inviarti l'output, è una delle certezze....
</CiBerFiduciaInCF>
CiBer
Il 04/05/2012 12.16, Puglia Marco ha scritto:
Quando dici “quello che ha pronto” cosa intendi? All’interno del loop scrivo delle cose sul browser, quando le visualizza? Ogni tot tempo? Ogni tot byte? Quando ne ha voglia, se ne ha voglia?
Grazie J
================================
Marco Puglia
Project Manager
Business-e S.r.l. <http://www.business-e.it/> (an Itway Group Company)
Via F.lli Lumière, 65 - 48010 Ravenna
Tel. +39 0544.460413 - Fax +39 0544.272297
Cell. 348 4759233
Italy, France, Spain, Portugal, Greece, Turkey
Ravenna, Milano, Trento, Bari, Massa, Roma
Paris, Barcelona, Madrid, Lisboa, Athina, Istanbul, Ankara
================================
Da: [email protected] [mailto:[email protected]] Per conto di CiBer
Inviato: giovedì 3 maggio 2012 19:49
A: [email protected]
Oggetto: Re: Elaborare query con molti record
cflush con l'opzione interval=n ti manda dati verso il webserver e quindi il browser ogni n bytes da presentare, per cui metterlo all'interno del loop non ha alcun senso.
Se vuoi, invece, avere un output "a comando" devi mettere il solo tag cfflush SENZA parametri, ed allora ha senso metterlo all'interno del loop perché invia quello che ha pronto quando gli dici di inviare
CiBer
Il 03/05/2012 18:32, Fabio Serra ha scritto:
mettici qualcosa in output tipo dei puntini
... <cfflush interval="10">
2012/5/3 Puglia Marco <[email protected]>
In effetti così sembra funzionare, però non sono ancora riuscito a capire bene il funzionamento di <cfflush>, se lo metto dentro il loop della query in questo modo:
<cfloop query="elenco">
<cfset midean13=elenco.codiceean>
<cfquery name="trova" datasource="liberamente">
select * from libridb where idean13='#midean13#'
</cfquery>
<cfif trova.recordcount eq 1>
<cfoutput>#midean13#</cfoutput> non trovato (da aggiungere)<br>
</cfif>
<cfflush interval="10">
</cfloop>
Non mi mostra niente durante l’elaborazione, rimane fermo per qualche secondo e poi visualizza la pagina a loop concluso.
Come mai?
================================
Marco Puglia
Project Manager
Business-e S.r.l. <http://www.business-e.it/> (an Itway Group Company)
Via F.lli Lumière, 65 - 48010 Ravenna
Tel. +39 0544.460413 <tel:%2B39%200544.460413> - Fax +39 0544.272297 <tel:%2B39%200544.272297>
Cell. 348 4759233
Italy, France, Spain, Portugal, Greece, Turkey
Ravenna, Milano, Trento, Bari, Massa, Roma
Paris, Barcelona, Madrid, Lisboa, Athina, Istanbul, Ankara
================================
Da: [email protected] [mailto:[email protected]] Per conto di Fabio Serra
Inviato: mercoledì 25 aprile 2012 12:56
A: [email protected]
Oggetto: Re: Elaborare query con molti record
Ma dopo quanto tempo ti va in time-out? Senza impelagarti in altre cose hai aumentato il timeout di coldfusion ed usato cfflush per non far andare in tiimeout il browser?
All'inizio della procedura metti un bel
<cfsetting requestTimeOut = "1800"> numero di secondi
poi dentro il loop della query metti un <cfflush>
così manda sempre al browser qualcosa e non va in timeout. Guardati bene cfflush dove puoi specificarli ogni quanti byte mandare qualcosa al browser etc etc.
Comunque in questo modo il browser non va mai in timeout e neanche coldfusion. Dovresti aver risolto.
2012/4/23 Puglia Marco <[email protected]>
Vi pongo questo quesito che mi attanaglia ormai da diverso tempo.
Situazione
Ho una query che estrare i dati da una tabella su Mysql (circa 800.000 record).
Necessità
Per ogni record estratto, devo controllare se esiste l’ID su un’altra tabella, in caso negativo vado ad aggiungere il record sulla seconda tabella.
Problema
Se eseguo un loop sulla query per tutti gli 800.000 record il browser va in timeout.
Ho provato a spezzare la query e ricaricare lo script ogni 10000 record, ma quanto arrivo a 200.000 il browser mi dice che c’è un problema di loop.
Come posso risolvere?
Grazie a tutti in anticipo per la risposta.
================================
Marco Puglia
Project Manager
Business-e S.r.l. <http://www.business-e.it/> (an Itway Group Company)
Via F.lli Lumière, 65 - 48010 Ravenna
Tel. +39 0544.460413 <tel:%2B39%200544.460413> - Fax +39 0544.272297 <tel:%2B39%200544.272297>
Cell. 348 4759233
Italy, France, Spain, Portugal, Greece, Turkey
Ravenna, Milano, Trento, Bari, Massa, Roma
Paris, Barcelona, Madrid, Lisboa, Athina, Istanbul, Ankara
================================
--
Fabio Serra
[email protected]
http://faser.net
--
Fabio Serra
[email protected]
http://faser.net