web-dev-qa-db-fra.com

ORA-03113: fin de fichier sur le canal de communication après une longue inactivité dans l'application ASP.Net

J'ai une application ASP.Net 2.0 à charge équilibrée (n'utilisant pas l'état de session) sur IIS5 fonctionnant sur un seul serveur Oracle 10g, en utilisant la version 10.1.0.301 des pilotes ODAC/ODP.Net. Après une longue période d'inactivité (quelques heures), l'application, apparemment au hasard, lèvera une exception Oracle:

Exception: ORA-03113: fin de fichier sur le canal de communication à Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src.D StringAccessAclateAccess) .OracleCommand.ExecuteReader (Requête booléenne, Boolean fillRequest, comportement CommandBehavior) sur Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... La partie Oracle de la pile se termine ici ...

Nous créons de nouvelles connexions à chaque demande, avons ouvert et fermé enveloppé dans un try/catch/enfin pour assurer une fermeture de connexion correcte, et le tout est enveloppé dans un bloc using (OracleConnection yadayada) {...}. Ce problème ne semble pas lié au redémarrage de l'application ASP.Net après avoir été arrêté pour inactivité.

Nous devons encore reproduire le problème nous-mêmes. Pensées, prières, aide?


Plus: Vérifié avec l'informatique, le pare-feu n'est pas configuré pour tuer les connexions entre ces serveurs.

23
Greg Hurlman

ORA-03113: fin de fichier sur canal de communication

La base de données vous permet-elle de savoir que la connexion réseau n'est plus. Cela pourrait être dû au fait que:

  1. Un problème de réseau - connexion défectueuse ou problème de pare-feu
  2. Le processus serveur sur la base de données qui vous dessert est mort de façon inattendue.

Pour 1) (pare-fe) recherchez tahiti.Oracle.com pour SQLNET.EXPIRE_TIME. Il s'agit d'un paramètre sqlnet.ora qui enverra régulièrement un paquet réseau à un intervalle configurable, c'est-à-dire que la définition de ce paramètre fera croire au pare-feu que la connexion est active.

Pour 1) (résea) parlez à votre administrateur réseau (la connexion peut être peu fiable)

Pour 2) Vérifiez le alert.log pour les erreurs. Si le processus serveur échoue, un message d'erreur s'affiche. Un fichier de trace aura également été écrit pour permettre au support d'identifier le problème. Le message d'erreur fera référence au fichier de trace.

Les problèmes de support peuvent être soulevés sur metalink.Oracle.com avec un identifiant de service client (CSI) approprié

19
mathewbutler

Ajoutez Validez Connection = true à votre chaîne de connexion.

Regardez ce blog pour en savoir plus.

DÉTAILS: Après OracleConnection.Close (), la véritable connexion à la base de données ne se termine pas. L'objet de connexion est remis dans le pool de connexions. L'utilisation du pool de connexions est implicite par ODP.NET. Si vous créez une nouvelle connexion, vous obtenez l'un du pool. Si cette connexion est "encore ouverte", la méthode OracleConnection.Open () ne crée pas vraiment de nouvelle connexion. Si la connexion réelle est rompue (pour une raison quelconque), vous obtenez un échec lors de la première sélection, mise à jour, insertion ou suppression.

Avec Valider la connexion, la connexion réelle est validée dans la méthode Open ().

8
Christian13467

Vérifiez qu'il n'y a pas de pare-feu qui met fin à la connexion après une certaine période de temps (c'était la cause d'un problème similaire que nous avons eu)

5
hamishmcn

fin de fichier sur le canal de communication:

L'une des conséquences de cette erreur est due à l'échec de la base de données à écrire le journal lorsqu'il est au stade de l'ouverture;

Solution vérifier la base de données si elle fonctionne dans ARCHIVELOG ou NOARCHIVELOG

pour vérifier l'utilisation

select log_mode from v$database;

si c'est sur ARCHIVELOG essayez de changer en NOARCHIVELOG

en utilisant sqlplus

  • montage de démarrage
  • modifier la base de données noarchivelog;
  • modifier la base de données ouverte;

si ça marche pour ça

Ensuite, vous pouvez ajuster votre zone de récupération flash, il est possible que votre zone de récupération flash soit pleine -> puis après avoir confirmé que votre zone de récupération flash a l'espace, vous pouvez modifier votre base de données dans le ARCHIVELOG

4
Mathias Stanley

Ce message d'erreur peut être jeté dans les journaux des applications lorsque le problème réel est que le serveur de base de données Oracle manque d'espace.

Après avoir corrigé le problème d'espace, ce message d'erreur particulier a disparu.

3
Rajesh

Vous pouvez essayer ce hack de registre:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

Si cela fonctionne, continuez à augmenter le KeepAliveTime. Il est actuellement réglé sur 2 minutes.

2
Ken Wren

L'article mentionné précédemment est bon. http://forums.Oracle.com/forums/thread.jspa?threadID=19175 (dans la mesure où cela va)

Si ce n'est pas quelque chose qui s'exécute fréquemment (ne le faites pas sur votre page d'accueil), vous pouvez désactiver le regroupement de connexions.

Il y a un autre "gotcha" qui n'est pas mentionné dans l'article. Si la première chose que vous essayez de faire avec la connexion est d'appeler une procédure stockée, ODP se suspendra !!!! Vous ne récupérerez pas une condition d'erreur à gérer, juste un HANG complet! La seule façon de résoudre ce problème est de désactiver le regroupement de connexions. Une fois que nous avons fait cela, tous les problèmes ont disparu.

La mise en commun est bonne dans certaines situations, mais au prix d'une complexité accrue autour de la première déclaration de chaque connexion.

Si l'approche de gestion des erreurs est si bonne, pourquoi n'en font-ils pas une option pour ODP de la gérer pour nous ????

0
Brad Bruce