Oracle.DataAccess.Client.OracleException ORA-03135: connexion perdu le contact
J'ai un .Net service qui se connecte à une base de données Oracle sur chaque demande. Il fonctionne bien au début, mais après un certain nombre de demandes-je commencer à obtenir:
Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader()
at MyApp.Services.OracleConnectionWithRetry.ExecuteReader(OracleCommand command)
...
Une idée de ce que pourrait être le problème? Je dispose de toutes les connexions, les résultats et les paramètres. La charge de ce service est, bien, très faible.
juste par curiosité, avez-vous résolu ce problème avec la vérification de l'état de la connexion par programmation (c'est à dire si déjà ouverte, ne rien faire) OU configuration de la Validation de la Connexion=true dans le web.config, OU les deux?
Salut @Luc, j'ai "résolu" le problème sur un plan personnel - j'ai quitté mon emploi pour faire un Doctorat 🙂
héhé félicitations, je ne peux malheureusement pas aller dans cette voie, pas assez intelligent 😉
sérieusement maintenant, avez-vous essayé la troisième option de sandyiits réponse? Je crois que je vais commencer à partir de là.
J'ai reçu un échantillon web app qui va exercer et de tester tous les trois options, et les combinaisons de, juste en attente d'approbation. J'en ferai part, merci.
Salut @Luc, j'ai "résolu" le problème sur un plan personnel - j'ai quitté mon emploi pour faire un Doctorat 🙂
héhé félicitations, je ne peux malheureusement pas aller dans cette voie, pas assez intelligent 😉
sérieusement maintenant, avez-vous essayé la troisième option de sandyiits réponse? Je crois que je vais commencer à partir de là.
J'ai reçu un échantillon web app qui va exercer et de tester tous les trois options, et les combinaisons de, juste en attente d'approbation. J'en ferai part, merci.
OriginalL'auteur Grzenio | 2010-07-30
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que vos demandes de code d'une connexion à partir de la Connexion Oracle de la Piscine et le pool de connexion renvoie une déconnexion /vicié de la connexion à la DB Oracle. ODP.NET n'a pas lui-même de tester l'état de la connexion de la connexion envoyé au client.
Afin d'être en sécurité, soit vous cochez la
connection status == Open
pour la connexion reçue de la piscine lorsque vous effectuez une Connexion.Open()OU
laisser ODP.NET effectuer la vérification pour vous par la mise en
Validate Connection = true
dans votre chaîne de connexion dans le web.config.À la fois ces méthodes ont un impact sur la performance que l'on teste l'état de la connexion chaque fois que vous avez besoin pour vous connecter à la base de données.
Une troisième option que j'utilise est l'utilisation d'exceptions. D'abord être optimiste et de l'utilisation whateven connexion est retourné à partir du pool de connexion. Si vous obtenez une erreur ORA - 3135 puis une nouvelle demande de connexion et d'exécuter votre requête à nouveau comme une boucle while. Dans le meilleur des cas, vous pouvez obtenir votre 1ère connexion valide, et votre requête sera exécutée. Dans le pire des cas, toutes les connexions dans votre piscine sont rassis, auquel cas le code sera exécutée N fois (où N est le lien de la taille du pool).
C'est pourquoi s'abstenir de vérification pour commencer. Aller avec la connexion que vous avez. Obtenir une nouvelle connexion si le courant d'échec.
Quand vous dites à la place de Valider la Connexion à l'intérieur de la chaîne de connexion, vous parlez dans le fichier ORA ou dans l'app.config?
Il sera en application.config
OriginalL'auteur sandyiit
J'ai vu cela aussi, essayez de désactiver le regroupement de connexion avec "la Mutualisation=false" dans la chaîne de connexion. J'ai une théorie que les connexions inactives dans la piscine expirer, mais ODP.NET ne se rendent pas compte qu'ils ont expiré, puis lorsque votre application en attrape un et essaie de faire quelque chose que vous obtenez de cette exception.
OriginalL'auteur William Gross