Java 在dbcp中使用PreparedStatement池

Java 在dbcp中使用PreparedStatement池,java,prepared-statement,connection-pooling,apache-commons-dbcp,Java,Prepared Statement,Connection Pooling,Apache Commons Dbcp,有人能解释一下使用dbcp准备好的连接池是如何使用的吗?(如果可能,请提供一些示例代码)。我已经知道如何打开它——将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但在那之后,具体准备的报表应该如何定义? 现在我只使用PoolgDataSource从池中获取连接。如何使用池中准备好的语句?从池中获取连接与获取“非池”连接相比,您的代码中是否有任何更改:)?我打赌你没有。准备好的声明也是如此。您的代码不应更改。因此,没有有用的代码示例 您应该

有人能解释一下使用dbcp准备好的连接池是如何使用的吗?(如果可能,请提供一些示例代码)。我已经知道如何打开它——将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但在那之后,具体准备的报表应该如何定义?
现在我只使用PoolgDataSource从池中获取连接。如何使用池中准备好的语句?

从池中获取连接与获取“非池”连接相比,您的代码中是否有任何更改:)?我打赌你没有。准备好的声明也是如此。您的代码不应更改。因此,没有有用的代码示例

您应该阅读JDBC数据源实现的文档,并了解开发人员对池的看法。这方面没有其他可靠的信息来源

发件人: 该组件还能够汇集PreparedStatements。启用时,将为每个连接创建一个语句池,并将汇集由以下方法之一创建的PreparedStatements:

* public PreparedStatement prepareStatement(String sql)
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

因此,您只需继续使用prepareStatement()调用,您的dbcp理论上将处理池(即,如果您试图创建“select*from users u where u.name like:id”,它将首先尝试在池中查找此语句)

以下是我使用的基本代码

    GenericObjectPool connectionPool = new GenericObjectPool(null);
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30);
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30);
    connectionPool.setNumTestsPerEvictionRun(3);
    connectionPool.setTestOnBorrow(true);
    connectionPool.setTestWhileIdle(false);
    connectionPool.setTestOnReturn(false);

    props = new Properties();
    props.put("user", username);
    props.put("password", password);
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props);

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true);
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool);

问题是,如果您使用一个
连接
,它将缓存
PreparedStatement
s,无论您是否需要,影响这一点的唯一可能方法是使用
数据源
属性或使用特定于供应商的API。但是其他连接看不到这些语句,如果您使用其他连接准备相同的语句,它将再次重新创建该语句。因此,像引擎盖下的DBCP这样的连接池允许在不同连接之间重用
PreparedStatement
s(它使用
PooledConnection
接口而不是简单的
Connection
),它们跟踪所有连接准备的所有语句


更新:似乎我在这个信息上错了,至少我在C3P0中找不到这个功能

真的吗?那么为什么PoolableConnectionFactory有一个用于语句池的参数呢?显然,必须有某种方法来建立它。和往常一样,Apache也帮不了什么忙。@Dan:想扩大你的评论吗?你不同意我回答的哪一部分?如果您再次阅读该问题,作者已经知道如何启用语句池。他想知道他需要在代码中做哪些更改(如果有的话)。抱歉,这是因为Apache通常缺乏文档。您对KeyedObjectPoolFactory传递了什么?GenericKeyedObjectPoolFactory的构造函数需要KeyedPoolableObjectFactory,我不知道如何创建其中一个将使用PreparedStatement用于的连接的构造函数。这不可能是正确的。为PoolableConnectionFactory的第三个参数传递null将禁用PreparedStatement缓存,如org.apache.commons.pool.ObjectPool、org.apache.commons.pool.KeyedObjectPoolFactory、java.lang.String、boolean、boolean)。这个论点应该用什么来解释?