Ce qui peut causer des erreurs intermittentes ORA-12519 (TNS: aucun handler approprié trouvé)

nous exécutons notre suite de test Junit 4 contre Weblogic 9 devant une base de données Oracle 10 (en utilisant Hudson comme serveur d'intégration continue) et occasionnellement nous aurons un crash ORA-12519 pendant le démontage du script. Cependant, l'erreur est très intermittente:

  • cela arrive habituellement pour la même classe de Test
  • Il n'arrive pas toujours pour le même cas de test (parfois, ils passent)
  • cela ne se produit pas pour le même nombre de cas de test (n'importe où de 3 à 9 ans)
  • parfois cela ne se produit pas du tout, tout passe

bien que je ne puisse pas garantir que cela n'arrive pas localement (quand je cours avec la même base de données, bien sûr), j'ai exécuté la même suite de classe plusieurs fois sans problèmes.

des idées?

38
demandé sur Mr. Muskrat 2008-10-15 19:25:49
la source

5 ответов

Je ne sais pas si ce sera la réponse de tout le monde, mais après quelques recherches, voici ce que nous avons trouvé.

l'erreur est évidemment causée par le fait que l'auditeur n'acceptait pas les connexions, mais pourquoi aurions-nous cette erreur alors que d'autres tests pourraient se connecter fine (nous pourrions aussi se connecter sans problème via sqlplus)? La clé du problème n'était pas que nous ne pouvions pas nous connecter, mais que c'était intermittente

après une enquête, nous avons découvert que il y avait des données statiques créées pendant la configuration de la classe qui garderaient les connexions ouvertes pendant la durée de vie de la classe test, en créant de nouvelles au fur et à mesure. Maintenant, même si toutes les ressources ont été correctement libérées lorsque cette classe est sortie de son champ d'application (via un bloc enfin {}, bien sûr), il y a eu des cas pendant la course où cette classe a englouti toutes les connexions disponibles (OK, bad practice alert - c'était un code de test unitaire qui s'est connecté directement plutôt qu'en utilisant un pool, donc le même le problème ne pouvait pas se produire dans la production).

le correctif était de ne pas rendre cette classe statique et de l'exécuter dans la configuration de la classe, mais plutôt de l'utiliser dans la configuration de la méthode per et les méthodes de démontage.

donc si vous obtenez cette erreur dans vos propres applications, tapez un profileur sur ce bad boy et voyez si vous pourriez avoir une fuite de connexion. Espérons que cela aide.

35
répondu cynicalman 2008-10-16 03:34:19
la source

une autre solution j'ai trouvé une erreur similaire mais le même message d'erreur est d'augmenter le nombre de gestionnaires de service trouvés. (Mon exemple de cette erreur a été causé par trop de connexions dans les pools de connexion de portail Weblogic.)

  • Exécuter SQL*Plus et la connexion comme SYSTEM. Vous devez savoir quel mot de passe vous avez utilisé lors de L'installation D'Oracle DB XE.
  • Exécuter la commande alter system set processes=150 scope=spfile; en SQL * Plus
  • très IMPORTANT: redémarrer le la base de données.

ici:

http://www.atpeaz.com/index.php/2010/fixing-the-ora-12519-tnsno-appropriate-service-handler-found-error/

26
répondu edwardsmatt 2012-03-05 08:58:38
la source

j'ai aussi eu le même problème, j'ai cherché les réponses de nombreux endroits. J'ai obtenu beaucoup de réponses similaires pour changer le nombre de manipulateurs de processus/service. Mais je me suis dit, et si j'oubliais de le réinitialiser?

alors j'ai essayé d'utiliser Thread.sleep() méthode après chacun de mes connection.close();.

je ne sais pas comment, mais ça fonctionne au moins pour moi.

Si quelqu'un veut l'essayer et de comprendre comment cela fonctionne alors s'il vous plaît aller de l'avant. Je voudrais aussi savoir que je suis un débutant dans le monde de programmation.

3
répondu Rahul Vishwakarma 2016-04-20 05:00:31
la source

j'ai eu le même problème. C'est arrivé à chaque fois que je lance un pack de tests de base de données (JDBC printemps) avec SpringJUnit4ClassRunner, alors j'ai résolu le problème en mettant@DirtiesContext annotation pour chaque test afin de nettoyer le contexte de l'application et libérer toutes les ressources ainsi chaque test pourrait être exécuté avec une nouvelle initalisation du contexte de l'application.

1
répondu Shendor 2016-12-19 18:36:54
la source

j'ai eu ce problème dans un test unitaire qui a ouvert beaucoup de connexions au DB via un pool de connexion et puis "a arrêté" le pool de connexion (ManagedDataSource en fait) pour libérer les connexions à la fin de chaque test. J'ai toujours manqué de connexions à un moment donné dans la série de tests.

ajouté un Thread.sleep(500) dans le teardown() de mes tests et cela a résolu le problème. Je pense que ce qui se passait était que le pool de connexion stop() libère l'actif les connexions dans un autre thread de sorte que si le thread principal continue à exécuter des tests, le(S) thread (s) de nettoyage se trouve (NT) si loin derrière que le serveur Oracle est à court de connexions. L'ajout du sleep permet aux fils de fond de libérer les connexions groupées.

Ceci est beaucoup moins un problème dans le monde réel parce que les serveurs DB sont beaucoup plus grands et il y a un mélange sain d'opérations (pas seulement des opérations de connexion/déconnexion DB sans fin).

1
répondu Andrew McGregor 2017-05-31 21:43:12
la source

Autres questions sur