Comment mettre en place un pool de connexions JDBC?
Quelqu'un peut-il donner des exemples ou des liens sur comment mettre en place un pool de connexions JDBC?
De la recherche sur google je vois beaucoup de façons différentes de le faire et c'est plutôt déroutant.
En fin de compte j'ai besoin du code pour renvoyer un java.sql.Connection
objet, mais je vais avoir du mal à obtenir commencé..des suggestions de bienvenue.
Mise à jour: N'est pas javax.sql
ou java.sql
ont mis en commun connexion implémentations? Pourquoi ne serait-il pas préférable d'utiliser ces?
- Non, le stock JDBC ne fournit pas de pool de Connexion. Vous avez besoin d'une bibliothèque distincte pour que. La plupart des serveurs d'application et des conteneurs de servlet ont des pools de Connexion inclus avec eux. Aussi, les implémentations JPA généralement fournir des implémentations ainsi.
- Une mise à jour pour jour moderne utilisateurs Java. JDBC 3.0+ (qui je crois est utilisé dans la version 6 de Java?) a une implémentation de mise en commun des DB connections. Java 7 utilise JDBC 4, et Java 8 JDBC 4.1.
- Concernant l'API JDBC 3.0 pour le regroupement de connexion: progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin d'un autonome pool de connexion, ma préférence va à C3P0 sur DBCP (que j'ai mentionné dans ce réponse précédente), j'ai juste eu trop de problèmes avec DBCP sous une lourde charge. À l'aide de C3P0 est mort simple. À partir de la la documentation:
Mais si vous êtes en cours d'exécution à l'intérieur d'un serveur d'application, je vous recommande d'utiliser l'intégré dans le pool de connexion qu'il fournit. Dans ce cas, vous devez le configurer (reportez-vous à la documentation de votre serveur d'application) et de récupérer une source de données via JNDI:
D'habitude, si vous avez besoin d'un pool de connexion vous écrivez une application qui s'exécute dans certains environnement géré, c'est que vous êtes en cours d'exécution à l'intérieur d'un serveur d'application. Si c'est le cas, assurez-vous de vérifiez que la connexion de mise en commun des installations de votre serveur d'applications offreavant d'essayer d'autres options.
L'out-of-the-box est la solution la mieux intégré avec le reste de l'application des serveurs installations. Si toutefois vous n'êtes pas en cours d'exécution à l'intérieur d'un serveur d'application je vous conseille le Apache Commons DBCP Composant. Il est largement utilisé et fournit tous la base groupement de la fonctionnalité de la plupart des applications exigent.
Je vous conseille d'utiliser le communes-dbcp de la bibliothèque. Il existe de nombreux exemples répertoriés sur la façon de l'utiliser, voici le lien pour le déplacer simple. L'utilisation est très simple:
Vous avez seulement besoin de créer la source de données une fois, alors assurez-vous de lire la documentation si vous ne savez pas comment le faire. Si vous n'êtes pas conscients de la façon d'écrire correctement JDBC états de sorte que vous n'avez pas de fuite de ressources, vous pouvez aussi envie de lire ce Wikipédia page.
javax.sql.DataSource
de l'interface de définition contient une implémentation de "pooling de Connexion“. ( d'ailleurs, je pense que vous savez déjà ce qu'est une interface JDBC est )HikariCP
C'est moderne, c'est rapide, c'est simple. Je l'utilise pour chaque nouveau projet.
Je le préfère à beaucoup plus de C3P0, je ne sais pas les autres piscines trop bien.
Ne pas réinventer la roue.
Essayez l'une des facilement disponibles 3ème partie composants:
utilisé en interne par Tomcat, et par
sincèrement vôtre.
Apache DBCP est livré avec différents exemple de configuration d'un groupement de javax.sql.Source de données. Voici un exemple qui peuvent vous aider à obtenir commencé.
disclecsia
obtenu le meilleur de moi. Vous pouvez voir que le lien est correct. 🙂tomcat-jdbc
. Vous pouvez l'obtenir à partir d'Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/...Dans le serveur d'application, nous utilisons où je travaille (Oracle Application Server 10g, comme je le rappel), la mise en commun est géré par le serveur d'application. Nous avons récupérer un
javax.sql.Source de données
à l'aide d'une recherche JNDI avec unjavax.sql.InitialContext
.il fait quelque chose comme ceci
(Nous n'avons pas d'écrire ce code, il est copié à partir de cette documentation.)
Piscine
performance
[re en utilisant le même objet est de réaliser une action sur l'Objet-Données] &memory
[affectation et de réaffectation des de nombreux objets crée une mémoire importante des frais de gestion].« La mutualisation [
Objet
piscine,String
Constante de la Piscine,Thread
Piscine, pool de Connexion]Constante de chaîne piscine
« Si la Chaîne de copie est disponible dans la Piscine puis retourne la référence.
« Dans le cas contraire, la Chaîne de l'objet est ajouté à la piscine et retourne la référence.
Exemple: Chaîne de vérifier Objet Unique de la piscine.
Pool de connexion à l'aide de Type 4 Pilote à l'aide de la 3e partie des bibliothèques[
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wikiDans le mécanisme de pool de connexions, lorsque la classe est chargée, elle est la
physique connexion JDBC
objets et fournit un enveloppé de connexion physique de l'objet à l'utilisateur.PoolableConnection
est un wrapper autour de la connexion réelle.getConnection()
de choisir l'une des gratuit enveloppé-forme de connexion la connexion objectpool et le renvoie.close()
au lieu de le fermer renvoie la enveloppé de connexion de retour de la piscine.Exemple: à l'Aide de ~ DBCP2 Pool de Connexion avec Java 7[
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.propriétés
Web Application: Pour éviter les problème de connexion lorsque toutes les connexions sont fermées[MySQL "wait_timeout" par défaut 8 heures] dans l'ordre de rouvrir la connexion sous-jacente DB.
Vous pouvez le faire Tester à Chaque Connexion en définissant testOnBorrow = true et validationQuery= "SELECT 1" et donot utiliser autoReconnect pour le serveur MySQL comme il est obsolète. question
Voir également:
public class StringPoolTest
juste a 2 méthodes void afin qu'ils ne retourne rien. N'est que le code fait passer par le processus de gestion de la chaîne piscine? Il n'a même pas l'air d'utiliser tous les arguments.s1
n'est pas défini?ConnectionPool
Classe. Merci beaucoup.À la fin de 2017 Proxool, BoneCP, C3P0, DBCP sont pour la plupart disparu à cette époque. HikariCP (créé en 2012) semble prometteuse, les coups les portes de rien d'autre que je connais.
http://www.baeldung.com/hikaricp
Proxool a un certain nombre de questions:
- Sous une charge lourde peut excéder le nombre maximum de connexions et de ne pas revenir en dessous de max
- Pouvez gérer pour ne pas revenir à la min connexions, même une fois les connexions expire
- Permet de verrouiller l'ensemble de la piscine (et tous les serveur/client de threads) si elle a des problèmes de connexion à la base de données lors de Ménage thread (ne pas utiliser .setQueryTimeout)
- Femme de ménage fil, tout en ayant le pool de connexion de la serrure de son processus, de la demande à l'Prototyper fil de recréer des connexions (sweep) qui peuvent entraîner en condition de course/de blocage. Dans ces appels de méthode le dernier paramètre doit toujours être de balayage:faux au cours de la boucle, seulement de balayage:true ci-dessous.
- Femme de ménage a besoin seulement de la seule PrototypeController balayer à la fin et a plus [mentionnée ci-dessus]
- Femme de ménage fil des contrôles pour les tests de connexions avant de voir quels liens peut-être expiré [certains des risques de l'essai a expiré connexion qui peut être cassée ou résilié par l'intermédiaire d'autres délais d'expiration de la DB dans le pare-feu, etc].
- Le projet a inachevé code (des propriétés qui sont définies mais sans suite)
- La valeur par Défaut max de connexions vie si non définie est de 4 heures (excessive)
- Femme de ménage thread s'exécute toutes les cinq secondes par la piscine (trop)
Vous pouvez modifier le code et de mettre en œuvre ces améliorations. Mais comme il a été créé en 2003 et mis à jour en 2008, son manque de presque 10 ans de java améliorations que les solutions comme hikaricp utiliser.
Comme répondu par d'autres, vous aurez probablement être heureux avec Apache Dbcp ou c3p0. Les deux sont populaires, et fonctionnent très bien.
Concernant votre doute
Ils ne fournissent pas mises en œuvre, plutôt interfaces et certaines classes de soutien, seules conditions pour les programmeurs qui mettent en œuvre des bibliothèques tierces (piscines ou des pilotes). Normalement, vous ne regardez même pas que. Votre code doit composer avec les connexions de votre piscine tout comme ils ont été "clair" des connexions, de manière transparente.
Vibur DBCP est une autre bibliothèque à cette fin. Plusieurs exemples montrant comment le configurer pour l'utiliser avec Hibernate, Spring+Hibernate, ou par programmation, peuvent être consultés sur son site web: http://www.vibur.org/
Aussi, voir l'avertissement ici.
Apache Commons dispose d'une bibliothèque à cet effet: DBCP. Sauf si vous avez étrange exigences autour de vos piscines, je voudrais utiliser une bibliothèque comme il est lié à être plus difficile et plus subtile qu'on ne pourrait l'espérer.
Vous devriez envisager d'utiliser de l'UCP.
De Connexion universel, Piscine (UCP) est un Java pool de connexion. C'est une des fonctionnalités riches pool de connexion et étroitement intégré avec Oracle Real Application Clusters (RAC), directeur général adjoint, DG de bases de données.
Reportez-vous à cette page pour plus de détails au sujet de l'UCP.
MiniConnectionPoolManager
est un java-fichier de mise en œuvre, si vous êtes à la recherche d'une solution intégrable et ne sont pas trop préoccupés par les performances (même si je ne l'ai pas testé sur ce sujet).Il est multi-licence EPL, LGPL et MPL.
Sa documentation donne aussi des alternatives à la peine de vérifier (sur le haut de DBCP et C3P0):