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