0

J'écris un pool de connexions DB en Java. C'est juste une classe qui détient un tas de connexions et les distribue. Ai-je besoin d'une sorte de méthode destructeur pour que les connexions DB soient fermées lorsqu'une instance de ma classe est hors de portée?Java - Gestion de la mémoire/connexions DB question

Éditer: Ceci est pour à des fins d'apprentissage seulement. J'utiliserais certainement un pool de connexions open source fiable en production. Je veux juste vraiment comprendre les implications de la gestion de la mémoire.

+1

fins d'apprentissage, mec. Chill – Greg

+1

@Mitch @Greg Upvoted vos deux commentaires ... – Waldheinz

Répondre

2

Si vous essayez de le faire à des fins d'apprentissage, alors ce que vous faites est bien. Téléchargez le code source de l'une des bibliothèques mentionnées ci-dessous et parcourez leur code. Cela vous aiderait à comprendre comment ils gèrent le cycle de vie d'une connexion.

Mais si vous voulez l'utiliser dans le cadre d'une application de production alors je vous recommande fortement d'utiliser l'un des ci-dessous

  1. BoneCP
  2. c3p0
+0

DBCP fonctionnerait aussi bien. – rfeak

+0

Je ne l'ai pas mentionné parce que nous avons eu quelques problèmes avec elle et la recommandation générale que j'ai reçue est de passer à c3p0 –

2

Juste à côté de la partie supérieure de ma tête, dis que tu as un objet, ta clé. Implémentez une identité unique pour votre clé. hashCode() est un bon endroit pour commencer. Lorsque vous créez votre objet, placez l'objet dans un WeakReference et associez-le à un ReferenceQueue. Maintenant, utilisez le hashCode comme clé d'un Map<int, Connection>. Lorsque votre objet est hors de portée, allez au ReferenceQueue pour récupérer l'objet, utilisez le hashCode pour obtenir le Connection du Map et fermez-le.

Voir tutoriel sur les références here

1

La bonne façon de le faire est d'envelopper l'instance de connexion dans votre propre classe qui implémente java.sql.Connection, puis donner que « Connexion » à travers la piscine. Vous serez obligé de mettre en œuvre toutes les méthodes que vous pouvez transmettre avec bonheur à la "vraie" connexion. Sauf pour un - close(). Dans cette méthode, vous devez renvoyer la connexion au pool sans la fermer.

Vous ne pouvez pas renvoyer un objet au pool en le laissant simplement hors de portée. Vous pouvez mettre quelque chose dans finalize() qui le renvoie dans le pool, mais cela est dangereux. Finalize() ne s'exécute qu'une seule fois pour n'importe quel objet, donc si vous mettez quelque chose dedans pour "attraper" l'objet et l'empêcher d'être gc'd, le finalize() ne sera plus jamais appelé dessus.

+0

ou n'importe qui: Ainsi dans votre conception proposée chaque connexion retournerait à la piscine quand étroite est appelé sur la connexion. Mais que se passe-t-il lorsque mon programme se termine? Comment puis-je fermer les connexions? (Il semble que si je ne les ferme pas explicitement, MySQL les gardera ouverts au moins pendant un moment.) – Greg

+0

Quand un programme se termine, on s'en fout généralement, le serveur db le comprendra. En fait, on tue 9 serveurs en production. Mais pendant l'exécution, vous pouvez être sophistiqué et reconnaître dans le pool que les connexions disponibles ont été sur un certain nombre pendant un certain temps, puis les retirer du pool. –