【问题标题】:What is c3p0 in more deeper way?更深层次的 c3p0 是什么?
【发布时间】:2014-06-02 03:52:37
【问题描述】:

我已经使用 Hibernate ORM 一年了,c3p0 大约几个月了。 我在网上看到,c3p0 是一个 JDBC 连接和语句池库,它增强了 JDBC 驱动程序。

但是,我想知道,它到底在哪里?

供参考,这里是JDBC-ODBC桥的示意图。

现在,c3p0 取代了 JDBC API?

或者它使用一些增强的类而不是传统的 JDBC API 类与 JDBC API 一起工作?

如果两者都不是,那么它的作用以及它在此原理图中的位置,甚至在此原理图中的位置?

请详细说明您知道的 C3P0!

【问题讨论】:

  • 文档不够清晰? mchange.com/projects/c3p0
  • 是的,我已经阅读了它的介绍部分。而且,我在问题中也提到过。但是,我无法理解 jdbc 架构中 c3p0 的物理存在。

标签: java hibernate jdbc c3p0


【解决方案1】:

您发布的图片与 Type-1 JDBC 驱动程序有关,该驱动程序如今大多是遗留的。更一般地说,图片解释了与理解 C3P0 无关的底层细节。

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

【讨论】:

  • “位于原始 JDBC DriverManager 上方”。那么,它是替代 JDBC API 还是只是增强了 JDBC API 的某些部分,例如获取数据库连接?而且,JDBC API 还执行其他操作吗?
  • 是的,连接是从 DataSource 中检索的,但从那时起它就全部是标准的 JDBC。
【解决方案2】:

其实c3p0是我们在Hibernate中使用的一个JAR文件。

当我们运行我们的 Hibernate 应用程序时,我们可以在控制台中看到有一行“Connection Pool Size 20”。那是可用的连接对象的数量。如果我们只使用 5 个连接,那么 15 个连接对象将是一种浪费,并且在工业上“连接对象”是非常昂贵的资源。这就是为什么要定义我们的应用程序中可能需要的连接对象的数量,我们使用 c3p0 JAR 文件。

【讨论】:

    【解决方案3】:

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

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

    返回的 JDBC 连接通常是一个包装对象,它将 JDBC API 调用委托给底层数据库的 JDBC 驱动程序。

    一个堆栈跟踪值千言万语:

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

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多