Java 在dbcp中使用PreparedStatement池
有人能解释一下使用dbcp准备好的连接池是如何使用的吗?(如果可能,请提供一些示例代码)。我已经知道如何打开它——将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但在那之后,具体准备的报表应该如何定义?Java 在dbcp中使用PreparedStatement池,java,prepared-statement,connection-pooling,apache-commons-dbcp,Java,Prepared Statement,Connection Pooling,Apache Commons Dbcp,有人能解释一下使用dbcp准备好的连接池是如何使用的吗?(如果可能,请提供一些示例代码)。我已经知道如何打开它——将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但在那之后,具体准备的报表应该如何定义? 现在我只使用PoolgDataSource从池中获取连接。如何使用池中准备好的语句?从池中获取连接与获取“非池”连接相比,您的代码中是否有任何更改:)?我打赌你没有。准备好的声明也是如此。您的代码不应更改。因此,没有有用的代码示例 您应该
现在我只使用PoolgDataSource从池中获取连接。如何使用池中准备好的语句?从池中获取连接与获取“非池”连接相比,您的代码中是否有任何更改:)?我打赌你没有。准备好的声明也是如此。您的代码不应更改。因此,没有有用的代码示例 您应该阅读JDBC数据源实现的文档,并了解开发人员对池的看法。这方面没有其他可靠的信息来源 发件人: 该组件还能够汇集PreparedStatements。启用时,将为每个连接创建一个语句池,并将汇集由以下方法之一创建的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);
问题是,如果您使用一个
连接
,它将缓存PreparedStatement
s,无论您是否需要,影响这一点的唯一可能方法是使用数据源
属性或使用特定于供应商的API。但是其他连接看不到这些语句,如果您使用其他连接准备相同的语句,它将再次重新创建该语句。因此,像引擎盖下的DBCP这样的连接池允许在不同连接之间重用PreparedStatement
s(它使用PooledConnection
接口而不是简单的Connection
),它们跟踪所有连接准备的所有语句
更新:似乎我在这个信息上错了,至少我在C3P0中找不到这个功能 真的吗?那么为什么PoolableConnectionFactory有一个用于语句池的参数呢?显然,必须有某种方法来建立它。和往常一样,Apache也帮不了什么忙。@Dan:想扩大你的评论吗?你不同意我回答的哪一部分?如果您再次阅读该问题,作者已经知道如何启用语句池。他想知道他需要在代码中做哪些更改(如果有的话)。抱歉,这是因为Apache通常缺乏文档。您对KeyedObjectPoolFactory传递了什么?GenericKeyedObjectPoolFactory的构造函数需要KeyedPoolableObjectFactory,我不知道如何创建其中一个将使用PreparedStatement用于的连接的构造函数。这不可能是正确的。为PoolableConnectionFactory的第三个参数传递null将禁用PreparedStatement缓存,如org.apache.commons.pool.ObjectPool、org.apache.commons.pool.KeyedObjectPoolFactory、java.lang.String、boolean、boolean)。这个论点应该用什么来解释?