Quelle méthode peut être utilisée pour l'enquête sur l'utilisation de la connexion de base de données en Java? P>
Un développeur prend en charge un programme Java complexe qui est en train d'épuiser le nombre de connexions de base de données disponibles. Depuis que le problème est sporadique, il serait utile de savoir quel thread a ouvert plusieurs connexions à la base de données pour concentrer les efforts dans cette zone. P>
En fin de compte, le correctif correct semble être de réécrire le programme de réutiliser les connexions et non d'ouvrir plusieurs connexions par fil. P>
Je demande, quelles méthodes le développeur doit-elle avoir dans sa boîte à outils pour pouvoir enquêter sur les ressources I.E. Les connexions de base de données attribuées par un thread. P>
5 Réponses :
regarder log4jdbc . Il vous permet d'examiner tous les trucs sur votre JDBC, notamment des connexions d'ouverture / fermeture ainsi que des informations de numéro de connexion. P>
Les pools de connexion peuvent vous donner des diagnostics. Par exemple, Consultez la propriété de débogUneReTurnedConnectionSACKTraces pour le pool de connexion C3P0: P>
http://www.mchange.com/projects/c3p0/index .html # DebugUneReturnedConnectionStackTraces P>
Quelqu'un m'a montré ConnleakFinder Récemment, "Un outil simple pour identifier les fuites de connexion JDBC dans le code Java". Je ne l'ai pas testé moi-même jusqu'à présent, mais cela devrait vous permettre de voir qui n'a pas fermé la connexion après utilisation em>. Voir Connexion + fuite + comment + à + recherche.htm . P>
Mais en effet, vous devriez en effet, vous devez utiliser un pool de connexion (par exemple C3P0 ). p>
P6SPY est un cadre open source pour prendre en charge les applications interceptées et modifier éventuellement modifier les relevés de base de données. P >
de http://www.p6spy.com/about.html
La distribution P6SPY comprend les modules suivants: P>
Alors que P6SPY est un outil agréable, je ne vois pas comment cela vous aide à rechercher des problèmes de chasse.
Pas un outil spécifique, mais plutôt une technique de débogage pour suivre le code du code responsable des connexions ouvertes ou d'autres ressources. P>
Je suppose que vous utilisez une méthode cohérente du côté Java pour obtenir une connexion DB (mise en commun ou non). P>
L'idée est de créer une classe d'emballage très légère autour de votre usine de connexion / piscine ou quoi que ce soit. Le wrapper mettra en œuvre n'importe quelle interface JDBC de sens afin que vous puissiez l'échanger pour votre objet de connexion normal, mais la plupart des méthodes appellent / retourneront de manière transparente la connexion sous-jacente. P>
Si vous utilisez une sorte de cadre IOC (E.G. Spring), vous devriez être capable d'échanger facilement la classe de connexion / usine à un niveau de configuration. Maintenant, tout votre code Java utilisera votre nouveau wrapper de connexion DB. P>
Si vous utilisez une piscine, appelez Maintenant, nous devons simplement enregistrer les bits intéressants et définir un piège pour les connexions fuites. P>
Dans le constructeur ou la méthode d'usine de votre emballage de connexion Créez un nouvel objet loveable code> et stockez-le comme une variable locale dans votre enveloppe pour plus tard. Nous utilisons un Implémentez la méthode Le MAINTENANT Le CODE> DANSABLE CODE> revient dans la lecture. Nous pouvons saisir le Cette méthode peut être adaptée à une variété de situations. Vous pouvez bien sûr conserver d'autres types de données dans votre wrapper pour dépanner votre problème spécifique. Par exemple la création. Ensuite, vous pouvez sonder les connexions à long terme et impliquer à nouveau le Créateur. Ou vous pouvez sonder des connexions existantes et analyser les traces de pile code> loveable code> pour obtenir des données sur quel code utilise le nombre de connexions au fil du temps. P>
Il y a probablement un outil hors tension pouvant également faire ce type de choses, mais la quantité de code requise pour appliquer cette technique est très minime dans la plupart des cas (en supposant que vous ayez un moyen facile d'échanger votre dB. Connexion usine sans recherche-remplacement de votre code global). p> Connection.Close () Code> Retourne généralement l'objet à la piscine au lieu de détruire la connexion. Donc, cette technique fonctionne pour une fuite de connexion normale ou vient de «non renoncée à la piscine (piscine épuisée)» Fuite. P>
Trac de pile pour identifier le créateur h1>
jetable code> car il est plus rapide / moins cher que d'utiliser
thread.CurrentThread (). GetStackTrace () code>. P>.
Définir le "piège" h1>
finaliser code> dans votre classe wrapper. Ceci est une méthode de nettoyage appelée par la GC lorsque l'objet est en train d'être détruit car il n'est plus utilisé. P>
finaliser la méthode code> doit vérifier "suis-je fermé?". Si déjà fermé, tout va bien ... Toutefois, si la connexion est en train d'être gérée et qu'elle n'a pas été fermée ... alors il s'agit d'une connexion "fuite". p>
lancer code> et sortir un joli journal de journal indiquant quelque chose comme: "Je suis une connexion fuite et voici une trace de pile impliquant mon créateur." P>
Développer l'idée h1>
La méthode que vous souhaitez implémenter s'appelle finaliser code> non
enfin code>.
Merci @Ring. Fixé. Été plus de 7 ans depuis mes jours Java. Appréciez l'aide.