有人能解释一下如何使用 dbcp 准备的连接池吗?(如果可能,请提供一些示例代码)。我已经想出了如何打开它——将 KeyedObjectPoolFactory 传递给 PoolableConnectionFactory。但是具体的prepared statements应该如何定义呢?现在我只使用 PoolingDataSource 从池中获取连接。如何使用池中准备好的语句?
3 回答
好吧,谈论从池中获取连接与获得“非池化”连接,您的代码是否有任何更改:)?我打赌你不会。与准备好的语句相同。您的代码不应更改。因此,没有有用的代码示例。
您应该阅读有关您的 JDBC 数据源实现的文档,并了解开发人员对池的看法。没有其他可靠信息来源。
从这里开始:该组件还具有汇集 PreparedStatements 的能力。启用后,将为每个 Connection 创建一个语句池,并且将池化由以下方法之一创建的 PreparedStatements:
* public PreparedStatement prepareStatement(String sql)
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
因此,您只需继续使用 prepareStatement() 调用,理论上您的 dbcp 将负责池化(即,如果您尝试从用户 u 中创建“select * 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);
问题是,如果您使用单个s,无论您是否需要Connection
,它都会缓存s,影响这一点的唯一可能方法是使用属性或使用供应商特定的 API。但是这些语句对其他连接不可见,如果您使用另一个连接准备相同的语句,它将再次重新创建它。因此,像 DBCP 这样的连接池允许在不同的连接之间重用(它使用interface 而不是 simple ),它们跟踪所有连接准备的所有语句。PreparedStatement
DataSource
PreparedStatement
PooledConnection
Connection
更新:似乎我在这个信息上错了,至少我在 C3P0 中找不到这个功能。