Qu'est-ce que c3p0 de manière plus profonde?


J'utilise Hibernate ORM depuis un an maintenant et c3p0 environ quelques mois. J'ai lu sur le Web, c3p0 est une bibliothèque de connexion et de regroupement d'instructions JDBC, qui améliore les pilotes JDBC.

Mais, je veux savoir, où se trouve-t-il exactement?

Pour référence, voici le schéma du pont JDBC-ODBC.

entrez la description de l'image ici

Maintenant, c3p0 remplace l'API JDBC?

Ou cela fonctionne avec l'API JDBC en utilisant certaines classes améliorées plutôt que l'API JDBC traditionnelle les classes?

Si ni l'un ni l'autre, que ce qu'il fait et où il appartient dans ce schéma ou même hors de ce schéma?

Veuillez élaborer plus sur C3P0, que vous connaissez!

Author: Akshat, 2014-04-17

3 answers

L'image que vous avez publiée concerne les pilotes JDBC de type 1, qui sont principalement hérités aujourd'hui. Plus généralement, l'image explique les détails de niveau inférieur qui ne sont pas pertinents pour comprendre C3P0.

C3P0 est simplement une implémentation de l'API DataSource, qui se trouve conceptuellement juste au-dessus du JDBC brut DriverManager. La fonction principale d'un DataSource est d'acquérir un JDBC standard Connection et de le libérer à la fin.

 10
Author: Marko Topolnik, 2014-04-17 18:28:10

Il ne remplace pas JDBC. Il gère plutôt les connexions. Création d'une connexion à la base de données est une opération coûteuse en temps. Du point de vue de l'application, les connexions individuelles sont principalement interchangeables lorsqu'elles sont dans un état "neutre" (pas de curseurs ouverts, de transactions, de variables personnalisées, de paramètres régionaux, quelle que soit la base de données définie pour une connexion).
Par conséquent, il est préférable d'ouvrir plusieurs connexions et de les réutiliser.

Je suppose que vous le savez. Maintenant, C3P0 utilise l'API JDBC pour obtenir le connexion lorsqu'il est demandé par l'application. L'application a généralement une autre API pour demander au pool une connexion. Il existe certaines exigences pour la connexion, définies par l'API. C3P0, comme mentionné dans l'autre réponse, implémente DataSource API, mais je crois qu'il a aussi des adaptateurs pour d'autres interfaces couramment utilisées.

La connexion JDBC renvoyée est généralement un objet wrapper qui délègue les appels d'API JDBC au pilote JDBC de la base de données sous-jacente.

Un stacktrace vaut mille mots:

! at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2566)
! at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:131)
! at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:210)
! at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
! at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
! at org.postgresql.Driver.makeConnection(Driver.java:452)
! at org.postgresql.Driver.connect(Driver.java:254)
! at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
! at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
! at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
! at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
! at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
! at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
! at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
! at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
! at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
 1
Author: Ondra Žižka, 2018-07-04 01:11:13

En fait c3p0 est un fichier JAR que nous utilisons dans Hibernate.

Lorsque nous exécutons notre application Hibernate, nous pouvons voir dans la console qu'il existe une ligne "Connection Pool Size 20". C'est le nombre d'objets de connexion disponible. Si nous n'utilisons que 5 connexions, alors 15 objets de connexion seront un gaspillage, et dans l'industrie, les "objets de connexion" sont des ressources très coûteuses. C'est pourquoi, pour définir le nombre d'objets de connexion qui peuvent être nécessaires dans notre application, nous utilisons le fichier JAR c3p0.

 0
Author: Kuldeep Kumar Sharma, 2018-07-05 09:04:34