Quelqu'un peut-il fournir des exemples ou des liens sur la façon d'établir un pool de connexions JDBC?
En recherchant sur Google, je vois de nombreuses 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 j'ai du mal à démarrer ... toutes les suggestions sont les bienvenues.
Mise à jour: les implémentations de connexion ne sont pas javax.sql
ou java.sql
n'ont pas été mises en commun? Pourquoi ne serait-il pas préférable de les utiliser?
Réponses:
Si vous avez besoin d'un pool de connexion autonome, ma préférence va à C3P0 sur DBCP (que j'ai mentionné dans cette réponse précédente ), j'ai juste eu trop de problèmes avec DBCP sous une charge lourde. Utiliser C3P0 est extrêmement simple. De la documentation :
Mais si vous utilisez un serveur d'applications, je vous recommande d'utiliser le pool de connexions intégré qu'il fournit. Dans ce cas, vous devrez le configurer (reportez-vous à la documentation de votre serveur d'application) et récupérer une DataSource via JNDI:
la source
Habituellement, si vous avez besoin d'un pool de connexions, vous écrivez une application qui s'exécute dans un environnement géré, c'est-à-dire que vous exécutez à l'intérieur d'un serveur d'applications. Si tel est le cas, assurez-vous de vérifier les fonctionnalités de regroupement de connexions fournies par votre serveur d'applications avant d'essayer d'autres options.
La solution prête à l'emploi sera la mieux intégrée au reste des installations de serveurs d'applications. Si toutefois vous n'utilisez pas un serveur d'applications, je recommanderais le composant Apache Commons DBCP . Il est largement utilisé et fournit toutes les fonctionnalités de mise en commun de base dont la plupart des applications ont besoin.
la source
HikariCP
C'est moderne, c'est rapide, c'est simple. Je l'utilise pour chaque nouveau projet. Je le préfère beaucoup au C3P0, je ne connais pas trop bien les autres piscines.
la source
Ne réinventez pas la roue.
Essayez l'un des composants tiers facilement disponibles:
Apache DBCP est livré avec différents exemples sur la façon de configurer un pooling javax.sql.DataSource . Voici un exemple qui peut vous aider à démarrer.
la source
disclecsia
eu raison de moi. Vous pouvez voir que le lien est correct. :)tomcat-jdbc
. Vous pouvez l'obtenir à partir de Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.orgJe recommanderais d'utiliser la bibliothèque commons-dbcp . Il existe de nombreux exemples listés sur la façon de l'utiliser, voici le lien vers le simple move . L'utilisation est très simple:
Vous n'avez besoin de créer la source de données qu'une seule fois, alors assurez-vous de lire la documentation si vous ne savez pas comment faire cela. Si vous ne savez pas comment écrire correctement des instructions JDBC afin de ne pas perdre de ressources, vous pouvez également consulter cette page Wikipédia .
la source
javax.sql.DataSource
définition de l'interface contient une implémentation de "Connection pooling" (en plus, je pense que vous savez déjà ce qu'est une interface JDBC)Dans le serveur d'applications que nous utilisons là où je travaille (Oracle Application Server 10g, si je me souviens bien), la mise en commun est gérée par le serveur d'applications. Nous récupérons un en
javax.sql.DataSource
utilisant une recherche JNDI avec unjavax.sql.InitialContext
.c'est fait quelque chose comme ça
(Nous n'avons pas écrit ce code, il est copié de cette documentation .)
la source
bassin
performance
[en utilisant les mêmes objets pour effectuer toute action sur les données d'objets] &memory
[l'allocation et la désallocation de nombreux objets crée une surcharge de gestion de la mémoire importante].«Pooling [
Object
pool,String
Constant Pool,Thread
Pool, Connection pool]Piscine constante de chaîne
Exemple: Chaîne pour vérifier l' objet unique du pool.
Piscine de connexion à l' aide de type 4 pilote en utilisant les bibliothèques 3ème partie [
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 connexion, lorsque la classe est chargée, elle récupère les
physical JDBC connection
objets et fournit un objet de connexion physique encapsulé à l'utilisateur.PoolableConnection
est un wrapper autour de la connexion réelle.getConnection()
choisissez l'une des connexions encapsulées gratuites du pool d'objets de connexion et la renvoie.close()
au lieu de le fermer, il renvoie la connexion encapsulée au pool.Exemple: utilisation de ~ DBCP2 Connection Pool 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.properties
Application Web : Pour éviter les problèmes de connexion lorsque toutes les connexions sont fermées [MySQL "wait_timeout" par défaut 8 heures] afin de rouvrir la connexion avec la base de données sous-jacente.
Vous pouvez le faire pour tester chaque connexion en définissant testOnBorrow = true et validationQuery = "SELECT 1" et ne pas utiliser autoReconnect pour le serveur MySQL car il est obsolète. problème
A voir aussi:
la source
public class StringPoolTest
juste a 2 méthodes vides afin qu'elles ne retournent rien. Ce code passe-t-il réellement par le processus de gestion du pool de chaînes? Il ne semble même pas utiliser d'arguments.s1
n'est pas défini?ConnectionPool
classe. Merci beaucoup.À la fin de 2017, Proxool, BoneCP, C3P0, DBCP sont pour la plupart disparus en ce moment. HikariCP (créé en 2012) semble prometteur, souffle les portes de tout ce que je sais. http://www.baeldung.com/hikaricp
Proxool a un certain nombre de problèmes:
- Sous une charge élevée, il peut dépasser le nombre maximum de connexions et ne pas revenir en dessous du maximum
- Peut réussir à ne pas revenir aux connexions minimes même après l'expiration des connexions
- Peut verrouiller tout le pool (et tous les threads serveur / client) s'il a des difficultés à se connecter à la base de données pendant le thread HouseKeeper (n'utilise pas .setQueryTimeout)
- Le thread HouseKeeper, tout en ayant le verrouillage du pool de connexions pour son processus, demande au thread Prototyper de recréer les connexions (balayage), ce qui peut entraîner une condition de concurrence / blocage. Dans ces appels de méthode, le dernier paramètre doit toujours être sweep: false pendant la boucle, seulement sweep: true en dessous.
- HouseKeeper n'a besoin que du seul balayage PrototypeController à la fin et en a plus [mentionné ci-dessus]
- Le thread HouseKeeper vérifie le test des connexions avant de voir quelles connexions peuvent être expirées [certains risques de tester une connexion expirée qui peut être interrompue / interrompue par d'autres délais d'expiration vers la base de données dans le pare-feu, etc.]
- Le projet a du code inachevé (propriétés définies mais sans action)
- La durée de vie maximale par défaut de la connexion si elle n'est pas définie est de 4 heures (excessive)
- Le thread HouseKeeper s'exécute toutes les cinq secondes par pool (excessif)
Vous pouvez modifier le code et apporter ces améliorations. Mais comme il a été créé en 2003 et mis à jour en 2008, il lui manque près de 10 ans d'améliorations Java utilisées par des solutions comme hikaricp.
la source
Comme d'autres l'ont répondu, vous serez probablement satisfait d' Apache Dbcp ou c3p0 . Les deux sont populaires et fonctionnent bien.
Concernant votre doute
Ils ne fournissent pas d'implémentations, mais plutôt des interfaces et certaines classes de support, uniquement valables pour les programmeurs qui implémentent des bibliothèques tierces (pools ou pilotes). Normalement, vous ne regardez même pas cela. Votre code doit traiter les connexions de votre pool comme il s'agissait de connexions «simples», de manière transparente.
la source
Vibur DBCP est une autre bibliothèque à cet effet. Plusieurs exemples montrant comment le configurer pour une utilisation avec Hibernate, Spring + Hibernate, ou par programme, peuvent être trouvés sur son site Web: http://www.vibur.org/
Consultez également la clause de non-responsabilité ici .
la source
Apache Commons a une bibliothèque à cet effet: DBCP . À moins que vous n'ayez des exigences étranges autour de vos piscines, j'utiliserais une bibliothèque car elle sera forcément plus délicate et plus subtile que vous ne l'espérez.
la source
Vous devriez envisager d'utiliser UCP. Universal Connection Pool (UCP) est un pool de connexions Java. Il s'agit d'un pool de connexions riche en fonctionnalités et étroitement intégré aux bases de données Oracle Real Application Clusters (RAC), ADG, DG.
Reportez-vous à cette page pour plus de détails sur UCP.
la source
MiniConnectionPoolManager
est une implémentation à un seul fichier java, si vous recherchez une solution intégrable et que vous n'êtes pas trop préoccupé par les performances (bien que je ne l'ai pas testé à cet égard).Il s'agit de licences EPL , LGPL et MPL multi-licences .
Sa documentation propose également des alternatives à vérifier (en plus de DBCP et C3P0):
la source