9
votes

Paramètre du délai d'attente inactif à Oracle

Nous sommes bloqués dans une situation où l'un de nos processus prend 3 heures d'informatique sans toucher la base de données. La connexion qui a été prise avant d'appeler le processus est fermée par le oracle serveur et toute requête ultérieure ou commit lance la connexion fermée Exception.

Il nous semble que le problème est lié à Oracle fermant la connexion inactive pour cette longue raison pour une raison quelconque.

Nous avons essayé de changer expire_timeout dans sqlnet.ora mais cela n'a pas aidé non plus.

Que pouvons-nous faire pour résoudre ce problème?


2 commentaires

Si vous n'utilisez pas la connexion pendant une si longue période, pourquoi ne pas la fermer et obtenir une nouvelle connexion lorsque vous en avez besoin? Holding sur une ressource dont vous n'avez pas besoin pour si longtemps, c'est un gaspillage.


Le code qui appelle le processus est un code tiers, je ne peux pas faire beaucoup à ce sujet. Ce que j'ai entendu de leur retour, c'est que nous devons augmenter le délai de connexion jusqu'à au moins jusqu'à ce que le processus revienne.


4 Réponses :


1
votes

Quelle que soit la base de données que vous utilisez, c'est une mauvaise idée de supposer que votre connexion va être en direct lorsque vous souhaitez l'utiliser. Une façon de gérer cela consiste à créer une fonction pour renvoyer une connexion active à la base de données en question et pour l'appeler à chaque fois que vous avez besoin d'une poignée / objet / peu importe pour une base de données donnée. La routine conserve une liste de bases de données et de leur objet de connexion associé. Si l'objet de connexion est en direct lorsque la fonction est appelée bien et bien et que l'objet est renvoyé après que la fonction effectue quelque chose avec elle pour convaincre la base de données de conserver la poignée / l'objet / tout ce qui est ouvert. S'il n'y a pas d'objet de connexion en direct, la routine ouvre un nouveau et le retourne. Il est utile d'avoir une deuxième routine qui campe sur une minuterie qui expire après 1 minute environ. Lorsque la minuterie expire et que la deuxième routine est appelée, elle examine la liste des connexions de base de données, en recherchant des liaisons sans activité pour une durée définie (quelque chose de nettement moins que la valeur du délai d'expiration de la base de données). Ceux qui ont été inactifs trop longtemps sont fermés et nettoyés.


1 commentaires

Merci pour la réponse, comme vous pouvez voir mes commentaires sur la question, son code tiers que nous utilisons et la solution recommandée par eux est que nous allons utiliser le paramètre idletimeout.



4
votes

Irfan,

  1. Veuillez vous assurer que vous avez la ressource_limit = true dans le fichier init.ora pour que les modifications prennent effet. p> li>

  2. En outre, veuillez vérifier si l'utilisateur que vous essayez de définir la limite pour est attribué au profil par défaut. p> li> ol>

    http://www.adp-gmbh.ch/blog/2005/april/17.html
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431
    


7 commentaires

init.ora n'a pas de variable de ressource_limit, je suppose que c'est défini sur FALSE par défaut. Cela signifie-t-il que Idle_time est défini sur des valeurs plus petites dans lesquelles ressource_limit est fausse. Ou est-il défini sur illimité. Bécuase Si son illimité par défaut, je n'ai rien à faire. les pensées


À partir de la documentation, il semble que la ressource_limit soit définie sur FLASE (qui est par défaut), elle désactive les applications des limites de ressources. Je ne suis pas sûr que cela donne du temps illimité pour Idle_time. Qu'est-ce que vous obtenez lorsque vous exécutez Sélectionnez Profil à partir de DBA_USERS où USERNAME = ; ?


Spécifiez la valeur par défaut si vous souhaitez omettre une limite pour cette ressource dans ce profil. Un utilisateur attribué à ce profil est soumis à la limite de cette ressource spécifiée dans le profil par défaut. Le profil par défaut définit initialement des ressources illimitées. Vous pouvez modifier ces limites avec l'énoncé de profil Alter download.oracle.com/docs/cd/b19306_01/server.102/b14200/...


Lorsque je requête pour Idle_time, le résultat est illimité. Donc mon état actuel est ressource_limit = false et idle_time = illimité et sqlnet.expire_time = 1440 et ce que j'essaie d'atteindre, c'est que ma connexion n'est pas terminée, si son inactif est de moins de 24 heures, pensez-vous que cette configuration est bonne de réaliser ce. Ou pensez-vous qu'il y a des choses qui me manquent?


Je ne sais pas ce qui manque. Est le Connect_time défini sur illimité aussi? Sélectionnez Profil, Nom de ressources, Limiter à partir de dba_profiles dans laquelle Profile = 'Par défaut' et Nom de ressources dans ('Connect_time', 'Idle_time'); Autre que cela, la seule chose à laquelle je puisse penser, c'est que votre serveur d'applications est chronométrant des connexions de base de données inactives. Exemple: pour Oracle en tant que SSO, le paramètre suivant peut entraîner la résiliation des connexions inactives. connectionIndletimeout dans le fichier Oracle_Home / SSO / CONF / POLICY.PROPERTES.


Oui vous corrigez, idle_timeout et Connect_timeout sont définis sur illimité


Je ne sais pas quel est le problème. Probablement un serveur d'applications qui punie des connexions inactives?



9
votes

Quelle est l'erreur que vous obtenez lorsque vous essayez d'utiliser la connexion?

Oracle par défaut ne fermez pas une connexion en raison d'une inactivité. Vous pouvez configurer un profil avec un temps Idle_Time pour créer Oracle pour fermer les connexions inactives, mais cela ne sonne pas comme ça. Vous pouvez également configurer Oracle pour détecter des connexions mortes et fermer la connexion si le client ne répond pas - si le client est enterré pendant trois heures, il est possible qu'il ne réponde pas en temps opportun. Mais cela semble moins probable que l'AD nécessite des étapes de configuration supplémentaires.

La situation plus probable dans mon expérience est que votre réseau est en train de laisser tomber la connexion. Si vous vous connectez via un pare-feu, par exemple, le pare-feu fermera fréquemment les connexions qui ont été trop longues.

Le message d'erreur Oracle que vous recevez indiquera laquelle de ces alternatives provoque votre problème.


0 commentaires

2
votes

Il semble que la raison actuelle de l'exception close la connexion code> est identique à celle de la grotte @justin forte> mentionnée dans sa réponse:

La situation plus probable dans mon expérience est que votre réseau est laisser tomber la connexion. Si vous vous connectez via un pare-feu, pour Exemple, le pare-feu fermera fréquemment les connexions qui ont été oisif trop long. p>

Le message d'erreur Oracle que vous recevez indiquera lequel de ces alternatives causent votre problème. P> BlockQuote>

Si toujours quelqu'un veut connaître le idile_time code> et connect_time code> configuré pour un profil, on peut exécuter ci-dessous la requête suivante: p>

select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');


0 commentaires