在dbcp中使用PreparedStatement池

时间:2008-11-11 18:22:09

标签: java prepared-statement connection-pooling apache-commons-dbcp

有人可以解释如何使用dbcp准确准备连接池吗? (如果可能,请使用一些示例代码)。我已经想出如何打开它 - 将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但是之后应该如何定义具体的准备陈述呢? 现在我只使用PoolingDataSource从池中获取连接。如何使用池中的预准备语句?

3 个答案:

答案 0 :(得分:6)

好好谈论从池中获取连接与获取“非池化”连接,您的代码是否有任何变化:)?我打赌你没有。与准备好的陈述相同。您的代码不应该更改。因此,没有有用的代码示例。

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

来自here: 该组件还具有池PreparedStatements的能力。启用后,将为每个Connection创建一个语句池,并且将汇集由以下方法之一创建的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”,它会尝试首先在池中找到这个语句)

答案 1 :(得分:0)

这是我使用的基本代码。

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

答案 2 :(得分:0)

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

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