J'ai stocké une procédure qui expire incroyablement à chaque fois qu'elle est appelée à partir de l'application Web.
J'ai lancé le Sql Profiler et tracé les appels qui expirent et finalement découvert ces choses:
- Lors de l'exécution des instructions à partir du MS SQL Management Studio, avec les mêmes arguments (en fait, j'ai copié l'appel de procédure à partir de la trace de profil SQL et l'ai exécuté): Il se termine en 5 ~ 6 secondes en moyenne.
- Mais lorsqu'il est appelé à partir d'une application Web, cela prend plus de 30 secondes (dans la trace), donc ma page Web expire réellement d'ici là.
Outre le fait que mon application Web a son propre utilisateur, tout est identique (même base de données, connexion, serveur, etc.) J'ai également essayé d'exécuter la requête directement dans le studio avec l'utilisateur de l'application Web et cela ne prend pas plus de 6 seconde.
Comment savoir ce qui se passe?
Je suppose que cela n'a rien à voir avec le fait que nous utilisons des couches BLL> DAL ou des adaptateurs de table car la trace montre clairement que le retard est dans la procédure réelle. C'est tout ce que je peux penser.
EDIT J'ai découvert dans ce lien qu'ADO.NET définit ARITHABORT
sur true - ce qui est bon pour la plupart du temps, mais cela se produit parfois, et la with recompile
solution de contournement suggérée consiste à ajouter une option au processus stocké. Dans mon cas, cela ne fonctionne pas mais je soupçonne que c'est quelque chose de très similaire à cela. Tout le monde sait ce que ADO.NET fait d'autre ou où je peux trouver les spécifications?