在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。