326 votes

Options de pool de connexion avec JDBC: DBCP vs C3P0

Quel est le meilleur groupement de connexions disponibles de la bibliothèque Java/JDBC?

Je suis en train d'étudier les 2 principaux candidats (libre / open-source):

J'ai lu beaucoup à ce sujet dans les blogs et autres forums, mais ne pouvait pas arriver à une décision.

Existe-il des solutions de rechange pertinentes pour ces deux?

183voto

j pimmel Points 7046

DBCP est pas à jour et pas du niveau de la production. Il y a quelque temps nous avons procédé à une analyse interne de la deux, la création d'un banc d'essai qui a généré de la charge et de la concurrence contre les deux afin d'évaluer leur pertinence dans des conditions réelles.

DBCP toujours généré des exceptions dans notre application de test et a lutté pour atteindre des niveaux de performance qui C3P0 était plus capable de la manipulation, sans aucune exception.

C3P0 aussi robuste traitée DB déconnecte et transparent se reconnecte sur le curriculum vitae alors que DBCP n'a jamais récupéré les connexions si le lien a été retiré de dessous. Pire encore DBCP a été le retour des objets de Connexion à l'application pour laquelle le transport sous-jacent était cassé.

Depuis lors, nous avons utilisé C3P0 dans 4 grands à forte charge de la consommation des applications web et n'a jamais regardé en arrière.

Mise à JOUR: Il s'avère que, après de nombreuses années d'être assis sur une étagère, l'Apache Commons folk ont pris DBCP de dormance et il est maintenant, une fois de plus, un activement développé projet. Donc mon post original peut être mis à jour.

Cela étant dit, je n'ai pas encore fait l'expérience de cette nouvelle mise à niveau de la bibliothèque de la performance, ni entendu parler de cela étant de facto en toute récente de l'application du cadre, encore.

181voto

user149789 Points 1721

Je vous invite à essayer de BoneCP -- c'est gratuit, open source, et plus rapide que les solutions de rechange disponibles (voir benchmark).

Avertissement: je suis l'auteur de sorte que vous pourriez dire que je suis partial :-)

Wallace

Mise à JOUR: en Mars 2010, toujours autour de 35% plus rapide que le nouveau réécrit Apache DBCP ("tomcat jdbc") de la piscine. Voir la dynamique de référence lien de référence de la section.

Mise à jour #2: (Déc '13) Après 4 ans au sommet, il y a maintenant beaucoup plus rapide concurrent : https://github.com/brettwooldridge/HikariCP

17voto

user542651 Points 81

J'ai eu du mal avec DBCP lorsque les connexions fois alors je l'ai testé c3p0. J'allais à la libération de cette production mais alors commencé des tests de performances. J'ai trouvé que c3p0 effectué terriblement. Je n'arrivais pas à le configurer pour effectuer bien à tous. J'ai trouvé deux fois plus lent que DBCP.

J'ai ensuite essayé la connexion de Tomcat mise en commun.

Cela a été deux fois plus rapide que c3p0 et de correction d'autres problèmes que j'ai avec DBCP. J'ai passé beaucoup de temps à les étudier et tester les 3 piscines. Mon conseil si vous êtes déploiement sur Tomcat est d'utiliser le nouveau Tomcat JDBC de la piscine.

14voto

Brandon Teo Points 109

Pour le problème de reconnexion automatique avec DBCP, avez-vous essayé d'utiliser les 2 paramètres de configuration suivants?

 validationQuery="Some Query"

testOnBorrow=true
 

12voto

cherio Points 496

J'utilise DBCP depuis quelques années en production. Il est stable, survit au redémarrage du serveur DB. Juste le configurer correctement. Il ne nécessite qu'une poignée de paramètres à spécifier donc ne soyez pas paresseux. Voici un extrait de notre code de production système qui répertorie les paramètres que nous avons explicitement définis pour le faire fonctionner:

 DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X