6

有人能解释一下如何使用 dbcp 准备的连接池吗?(如果可能,请提供一些示例代码)。我已经想出了如何打开它——将 KeyedObjectPoolFactory 传递给 PoolableConnectionFactory。但是具体的prepared statements应该如何定义呢?现在我只使用 PoolingDataSource 从池中获取连接。如何使用池中准备好的语句?

4

3 回答 3

7

好吧,谈论从池中获取连接与获得“非池化”连接,您的代码是否有任何更改:)?我打赌你不会。与准备好的语句相同。您的代码不应更改。因此,没有有用的代码示例。

您应该阅读有关您的 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”,它将尝试找到此语句先在游泳池里)

于 2008-11-11T21:05:34.160 回答
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);
于 2011-05-16T10:37:58.470 回答
0

问题是,如果您使用单个s,无论您是否需要Connection,它都会缓存s,影响这一点的唯一可能方法是使用属性或使用供应商特定的 API。但是这些语句对其他连接不可见,如果您使用另一个连接准备相同的语句,它将再次重新创建它。因此,像 DBCP 这样的连接池允许在不同的连接之间重用(它使用interface 而不是 simple ),它们跟踪所有连接准备的所有语句。PreparedStatementDataSourcePreparedStatementPooledConnectionConnection

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

于 2011-08-12T09:59:24.787 回答