什么是更深层次的c3p0?

时间:2014-04-17 18:17:39

标签: java hibernate jdbc c3p0

我现在使用Hibernate ORM一年,而c3p0使用了几个月。 我在网上读过,c3p0是一个JDBC连接和语句池库,它增强了JDBC驱动程序。

但是,我想知道,它究竟在哪里?

供参考,这是JDBC-ODBC桥的原理图。

enter image description here

现在,c3p0取代了JDBC API?

或者它使用JDBC API而不是传统的JDBC API类?

如果不是,那么它的作用和它在这个原理图中的位置,甚至是原理图中的哪个?

请详细说明你知道的C3P0!

2 个答案:

答案 0 :(得分:10)

您发布的图片与Type-1 JDBC驱动程序有关,这些驱动程序现在主要是遗留的。更一般地说,图片解释了与理解C3P0无关的低级细节。

C3P0只是DataSource API的一种实现,它在概念上位于原始JDBC DriverManager之上。 DataSource的主要功能是从中获取标准JDBC Connection并最终将其释放。

答案 1 :(得分:1)

它不替代JDBC。而是管理连接。创建与数据库的连接是耗时的操作。从应用程序的角度来看,处于“中立”状态时,各个连接大部分是可互换的(没有打开的游标,事务,自定义变量,语言环境,无论数据库可能为连接设置什么)。
因此,最好打开多个连接并重新使用它们。

我想你知道这一点。 现在,当应用程序请求时,C3P0使用JDBC API来获得连接。该应用程序通常具有一些其他API来请求池中的连接。 API定义了对连接的某些要求。如另一个答案中所述,C3P0实现了DataSource API,但我相信它也具有用于其他常用接口的适配器。

返回的JDBC连接通常是一个包装对象,该对象将JDBC API调用委派给基础数据库的JDBC驱动程序。

stacktrace值得一千个单词:

! 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)