JDBC连接池:连接重用?

时间:2010-06-21 09:13:00

标签: java jdbc connection-pooling

根据我的理解,JDBC连接池(在基本级别)以这种方式工作:

  1. 在应用初始化期间创建连接并放入缓存
  2. 按需向应用提供这些缓存的连接
  3. 一个单独的线程维护连接池,执行以下活动:
    • 丢弃已使用(已关闭)的连接
    • 创建新连接并添加到缓存以维持特定的连接数
  4. 但是,每当我在JDBC连接池讨论中听到“连接重用”这个术语时,我就会感到困惑。何时进行连接重用?

    这是否意味着连接池为两个不同的数据库交互提供相同的连接(不关闭它)?或者,有没有办法在DB调用后关闭连接后继续使用连接?

4 个答案:

答案 0 :(得分:12)

连接池通过重用连接来工作。应用程序从池中“借用”连接,然后在完成时“返回”它。然后将连接再次分发给应用程序的另一部分,甚至是不同的应用程序。

只要两个线程同时使用相同的连接,这是完全安全的。

连接池的关键是避免在可能的情况下创建新连接,因为它通常是一项昂贵的操作。重用连接对性能至关重要。

答案 1 :(得分:10)

连接池不会为您提供驱动程序中的实际Connection实例,但会返回一个包装器。当你从池中的Connection实例上调用'close()'时,它不会关闭驱动程序的Connection,而只是将打开的连接返回到池中,以便可以重用它(参见skaffman的答案)。

答案 2 :(得分:1)

连接池重用连接。 以下是apache dbcp如何工作下划线。

Connection poolableConnection= apacheDbcpDataSource.getConnection();

Apache DBCP实现返回类型为 PoolableConnection 的连接包装器。

poolableConnection.close();

PoolableConnection.close()检查实际的底层连接是否关闭,如果没有,则将该PoolableConnection实例返回到连接池(在这种情况下为 GenericObjectPool )。

if (!isUnderlyingConectionClosed) {
            // Normal close: underlying connection is still open, so we
            // simply need to return this proxy to the pool
            try {
                genericObjectPool.returnObject(this); //this is PoolableConnection instance in this case
....
              }

答案 3 :(得分:-1)

我的理解与上述相同,并且由于一个错误,我有证据表明它是正确的。在我使用的应用程序中有一个错误,一个带有无效列名的SQL命令。执行时会抛出异常。如果连接已关闭,则下次获取并使用连接时,此次使用正确的SQL,将再次抛出异常并且错误消息与第一次相同,尽管不正确的列名称甚至不出现在第二个SQL。因此,连接显然正在被重用。如果在抛出第一个异常后没有关闭连接(因为列名称错误),那么下次使用连接时一切正常。大概这是因为第一个连接尚未返回池中以供重用。 (这个错误发生在Jave 1.6_30和MySQL数据库的连接上。)