2017-09-29 21 views
0

Je me demande s'il existe une meilleure façon de faire ce que je fais. Cela fonctionne mais je pense qu'il devrait y avoir un meilleur moyen. Je reçois « La demande a dépassé la limite de temps admissible Tag: CFQUERY » Si mon résultat de la requête dans 20K enregistrements par exemple,Travailler avec ColdFusion - Boucler une procédure

  <cfquery name="GetMyRecords" datasource="MyDSN"> 
       SELECT idnumber,PrefAddr,...more colums 
       FROM um_valid 
       WHERE userid = <cfqueryparam cfsqltype="cf_sql_varchar" 
             value="#session.userid#"> 
       AND session_id = <cfqueryparam cfsqltype="cf_sql_numeric" 
             value="#session.Session_Id#"> 
       AND status NOT IN (<cfqueryparam cfsqltype="cf_sql_varchar" 

       value="X,C">) 
      </cfquery> 

J'ai aussi une procédure de stockage existante qui attendent des valeurs de la requête à faire ce qu'il est censé faire. Donc, je suis en boucle comme ceci:

<cfloop query="GetMyRecords"> 
    <cfstoredproc procedure="MyProc" datasource="MyDSN"> 
     <cfprocparam type="In" cfsqltype="CF_SQL_VARCHAR" 
         dbvarname="@id_number" value="#Trim(idnumber)#"> 
     <cfprocparam type="In" cfsqltype="CF_SQL_VARCHAR" 
        dbvarname="@Aaddr_pref_ind" value="#Trim(PrefAddr)#"> 
     ----- still more params to be passed---- 
    </cfstoredproc> 
</cfloop> 

Est-ce que ColdFusion a une meilleure technique pour éviter soit le temps d'erreur ou erreur 500?

+1

Je suggère de modifier votre procédure stockée ou d'écrire un nouveau afin que vous n'avez pas à faire des appels de base de données à l'intérieur de cette boucle. –

+0

Comment créer une fonction dans un composant existant et appeler la fonction sur chaque boucle? Est-ce que ça va aider? – MGL

+0

Vous pouvez essayer, mais j'en doute. –

Répondre

1

Comme une autre affiche mentionnée, réduire le nombre d'appels de base de données devrait être une priorité pour vous. Je suggère de joindre des données (si possible) dans votre première requête plutôt que de boucler votre requête et d'interroger à nouveau.

Pour résoudre le problème d'heure, vous pouvez mettre requestTimeout dans votre page pour remplacer le délai d'attente par défaut. L'heure est en secondes.

<cfsetting requestTimeOut = "600"> 

See this explanation.

0

Votre approche actuelle est de faire 1 requête, qui contient n enregistrements. Parcourez ensuite cet ensemble d'enregistrements en appelant une requête pour chaque enregistrement. Il en résulte dans votre appel n + 1 requêtes par demande. À mesure que le volume de données renvoyé par votre première requête augmente, le volume des requêtes globales effectuées dans la base de données augmente également. Dans votre cas, vous essayez d'appeler 20,001 à la base de données en une seule requête.

Idéalement, vous avez besoin d'une solution qui implique un appel à une procédure stockée avec une requête correctement optimisée qui peut renvoyer toutes vos données dans un ensemble d'enregistrements unique. Si vous n'avez pas besoin de vider toutes les données sur la page en même temps, créez une requête paginée qui renverra x nombre d'enregistrements par page. Ensuite, l'utilisateur peut aller page par page à travers la requête ou fournir un formulaire de recherche avec des filtres supplémentaires pour permettre à l'utilisateur de réduire la taille globale des enregistrements retournés.

0

Besoin de voir des requêtes complètes pour vous donner un exemple, mais en général, c'est une chose très utile dans CF pour vous aider!

Vous devez regarder dans l'attribut appelé groupe. Cela vous permet de spécifier une colonne pour regrouper votre sortie. Cela éliminera en fait le besoin du processus stocké que vous appelez entièrement.

La manière dont cela fonctionne vous permet de créer des sorties de sous-ensembles basées sur le regroupement. Ainsi, par exemple, vous pouvez le faire avec vos identifiants et produire ce groupe.

Vous pouvez également en avoir plusieurs et avoir des sections d'en-tête et de pied de page pour chacune d'entre elles à des fins d'affichage ou simplement de manipulation logique. Ceci vous permet d'interroger tout le jeu de données, puis de le manipuler dans la boucle sans avoir de sous-requêtes qui soient ultra inefficaces et grinçantes.

Ceci est quelque chose de tout à fait unique à ColdFusion, vérifiez-le!

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7ff6.html