在dbcp中使用PreparedStatement池

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

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

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

从这里 :该组件还具有池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”,它会尝试查找这个语句在游泳池第一)

这是我使用的基本代码。

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

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

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