2009-03-28 8 views
1

Ceci est une question assez vague et obtenir une réponse semble être un coup de feu, mais je ne sais pas quoi faire d'autre.Pourquoi mon site Web se fige-t-il constamment?

Depuis que j'ai mis mon site en ligne de temps en temps, il va juste se bloquer. Vous cliquez sur un lien et le navigateur se trouvera juste là comme s'il essayait de se connecter. Il semble que le gel peut durer jusqu'à 2 minutes, alors tout va bien. Puis, un peu plus tard, il fera la même chose.

Je fais le suivi de toutes les exceptions qui se produisent sur mon site Web dans un fichier journal.

Je reçois ces un peu ..

Délai d'attente expiré. Le délai d'attente écoulé avant la fin de l'opération ou le serveur ne répond pas

Et la trace de la pile indique que cela conduit à une méthode qui se connecte à la base de données.

Je suppose que le gel a à voir avec ce problème de timeout. Mon site Web est hébergé sur un serveur partagé et ma base de données se trouve sur un autre serveur avec environ un milliard d'autres bases de données.

Mais même sur un serveur partagé, ce problème de gel se produit tout le temps. C'est extrêmement ennuyeux. Et je peux voir que c'est un problème assez catastrophique étant donné que mon site est basé sur le commerce électronique et que les gens font des transactions dessus. La dernière chose que je veux est le gel du site lorsque mes utilisateurs cliquent sur le bouton "Soumettre un paiement", puis le bouton "Soumettre" est bloqué, le site se bloque, puis la carte de crédit est facturée environ 10 fois.

Est-ce que quelqu'un a des suggestions sur la meilleure façon de gérer cela?

+0

J'ai fait double et triple-vérifié pour m'assurer que mes connexions ont été disposées correctement et elles semblent toutes être OK. Ce qui est intéressant, c'est que les exceptions qui étaient précédemment enregistrées ont cessé, mais le gel demeure. Je n'ai aucune idée de ce qui se passe. Est-ce que ça pourrait être le ramasseur de déchets? – hanesjw

Répondre

2

Le délai d'attente a expiré. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas

Exception de délai d'attente de commande Sql - il peut être assez courant si votre base de données est en charge. Assurez-vous de disposer de SqlConnections et de SqlCommands - bien que cela entraîne généralement une exception de délai d'attente de pool (impossible de récupérer une connexion à partir du pool de connexions).

Les chances sont, quelqu'un exécute des requêtes qui sont mal réglées ou qui aspirent des ressources. C'est peut-être votre site, mais puisque vous êtes sur un serveur de base de données partagé, il pourrait tout aussi bien être celui de quelqu'un d'autre. Il pourrait aussi bloquer, ou ouvrir des transactions - puisque ce serait sur votre base de données, ce serait un problème de codage. Vous aurez probablement besoin d'impliquer votre hébergeur pour le localiser ou le déplacer vers un serveur dédié.

Vous pouvez réduire le CommandTimeout de votre SqlCommands - Je sais que cela semble quelque peu contre-intuitif, mais je trouve souvent qu'il vaut mieux échouer tôt que d'essayer pendant 60 secondes de lancer une charge supplémentaire sur le serveur. Si votre requête de 5 secondes ne se fait pas en 5 secondes, il y a de fortes chances que ce ne soit pas le cas en 60 non plus. Sinon, si vous êtes le type de patient, vous pouvez augmenter CommandTimeout, mais il existe également un délai d'attente de IIS de 90 secondes que vous devrez modifier si vous le multipliez trop.

4

Je suppose que cela a à voir avec les connexions à la base de données. Vérifiez pour voir qu'ils sont libérés correctement? Sinon, il les utilisera tous.

Vérifiez également si votre pool de base de données dispose d'un pool de connexions configuré.

+1

Des connexions incorrectement fermées seraient mon pari trop suivi par l'analyse des requêtes/index et l'amélioration de la couverture de cache. – Mufaka

+1

lorsque vous manquez de connexions au pool, vous obtenez une erreur spécifique du pool, pas seulement un délai générique. voir http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx –

1

Les erreurs de délai d'attente sont définitivement la source des pages de gel. Lorsque cela se produit, la page attend environ une minute pour la connexion à la base de données avant de renvoyer le message d'erreur. Comme le serveur Web ne gère qu'une seule page à la fois de chaque utilisateur, le site entier semblera être gelé pour l'utilisateur jusqu'à ce que l'erreur de délai d'attente arrive. Même si cela n'arrive que de temps en temps à quelques utilisateurs, cela leur semblera sévère car ils ne peuvent pas accéder au site pendant une minute.

La gravité du problème dépend du nombre d'erreurs que vous rencontrez. D'après votre description, il semble que vous en soyez un peu trop pour être normal.

Assurez-vous que tous vos lecteurs de données, objets de commande et objets de connexion sont correctement éliminés, afin de ne pas laisser les connexions ouvertes.

Recherchez également les erreurs de blocage dans le journal, car elles peuvent entraîner des dépassements de délai. Si vous avez des requêtes qui se verrouillent mutuellement, vous pouvez peut-être les améliorer en modifiant l'ordre dans lequel elles utilisent les tables.

1

Vérifiez les journaux SQL Server, en particulier pour les blocages.

Si vous avez plusieurs connexions ouvertes, il se peut que vous attendiez sur une ligne verrouillée par l'autre.

+1

Les interblocages SQL apparaissent comme quelque chose comme "System.Data.SqlClient.SqlException: transaction (ID de processus 73) a été bloquée sur verrouiller les ressources avec un autre processus et a été choisi comme victime de l'interblocage. –

+0

Il affichera uniquement l'erreur de blocage si le délai d'attente de blocage est plus court que la requête ou le délai d'expiration de la page Web. Ce n'est souvent pas le cas (du moins sur les sites Web que je maintiens). – Andomar

Questions connexes