2010-09-02 24 views
0

Notre DBA Oracle (9i) m'a appelé pour signaler que mon serveur Web IIS (v6) a épuisé les connexions disponibles.Connexions Oracle épuisées par IIS

J'ai créé une page de test (ASP classique) qui crée essentiellement des objets ADODB.Connection et ADODB.Recordset, se connecte à une base de données, ouvre un jeu d'enregistrements basique, le boucle, ferme le jeu et met les objets à zéro . C'est ce que font la plupart des applications sur le serveur web.

En parlant avec le DBA j'ai ouvert la page Web de test. Le DBA a pu voir que je me suis connecté et noté le ID (je suppose que ce ID l'aide à suivre la connexion). La page a terminé le chargement, par conséquent, la méthode Close des deux objets a eu s'est produite.

Le DBA a déclaré que la connexion était toujours visible, même après la fermeture du navigateur.

Finalement, la connexion a disparu, je suppose que le pool d'applications recyclé. Donc, ma question est: Est-ce normal? La connexion ne doit-elle pas disparaître après l'appel de la méthode Close .. ou au moins la session est-elle fermée?

Je ne suis pas sûr si cela est utile ou même liés, mais nous avons vu ces erreurs périodiquement dans l'observateur d'événements sur les nos serveurs web:

Event Type: Information 
Event Source: Application Error 
Event Category: (100) 
Event ID: 1004 
Date:  7/21/2010 
Time:  7:34:20 AM 
User:  N/A 
Computer: VMADE02 
Description: 
Reporting queued error: faulting application w3wp.exe, version 6.0.3790.3959, faulting module orantcp9.dll, version 9.2.0.6, fault address 0x00005741. 

Répondre

0

« La page a terminé le chargement, à cet effet, la méthode Close des deux objets doit avoir eu lieu. "

Ce "must" n'est pas le cas. Le garbage collector s'exécute (et exécute les destructeurs de vos objets COM), lorsque l'application manque de mémoire ou qu'elle a du temps à tuer. Aucune de ces conditions n'est garantie à chaque fois que IIS finit de diffuser une page. Raymond Chen a récemment écrit un bon article sur what garbage collection actually means, as opposed to what people think it means. Il parle de .NET, mais les mêmes principes s'appliquent ici. Garbage Collection tente de simuler une quantité infinie de mémoire. Il n'en sait pas assez sur Oracle pour tenter de simuler une offre infinie de connexions Oracle.

Vous devez simplement appeler Close() explicitement. Dans .NET, vous pouvez utiliser un bloc "using", qui simule une sémantique RIIA de type pile-object de type C++. Mais ce n'est pas une aide en ASP classique.

+1

Je suis désolé ... Je n'étais pas clair. L'application de test DOES appelle la méthode close pour l'objet connection (et le met à zéro), mais la connexion reste selon Oracle et le DBA, même après la fermeture du navigateur (pas que la fermeture du navigateur soit importante). Je vais changer le libellé dans la soumission .. merci. – carny666

+0

Merci, je l'ai maintenant. –

0

Je ne suis pas sûr que cet article est réellement utile puisque COM utilise un mécanisme de comptage de référence vs modèle de collecteur de garbage CLRs. C'est pourquoi il a mis les objets à Nothing, pour libérer explicitement l'objet.

La fermeture d'une connexion lorsque le regroupement de connexions ne ferme pas réellement la connexion. Il le relâche simplement à la piscine. J'ai entendu des histoires sur la mise en commun des connexions "mal tourné", alors essayez peut-être de le désactiver. Vous pouvez également spécifier une valeur pour le délai d'attente de connexion. Pour autant que je sache, ces deux paramètres peuvent être définis dans la chaîne de connexion pour l'application.