我想知道如何将dbcp设置为使用pool preparedstatements。我似乎有连接池的工作,但找不到太多的例子为准备语句。有一个related question进入preparedstatement池的使用过程,但是跳过了首先设置它的细节。显然,它涉及到将KeyedObjectPoolFactory
传递给PoolableConnectionFactory
,但我根本不清楚应该使用哪个实现,或者如何创建其构造函数所需的对象。
以下是我当前如何设置连接池:
private PoolingDataSource setupDataSource() {
ConnectionFactory connection_factory = new ConnectionFactoryImpl();
ObjectPool connection_pool = new GenericObjectPool();
PoolableConnectionFactory poolable_connection_factory = new PoolableConnectionFactory(connection_factory, connection_pool, null, "select 1", false, true);
PoolingDataSource data_source = new PoolingDataSource(connection_pool);
return data_source;
}
private static class ConnectionFactoryImpl implements ConnectionFactory {
private Properties connection_properties = new Properties();
public ConnectionFactoryImpl() {
connection_properties.put("user", USER);
connection_properties.put("password", PASSWORD);
connection_properties.put("zeroDateTimeBehavior", "convertToNull");
connection_properties.put("jdbcCompliantTruncation", "false");
}
@Override
public Connection createConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://" + SERVER + "/" + DEFAULT_DB, connection_properties);
}
}
这是
PoolableConnectionFactory
的第三个参数,用于控制准备好的语句池,但我不确定在那里使用什么。 最佳答案
如果您使用的是spring,那么它有一个帮助器来设置它。
但是,语句池在默认情况下是禁用的,因此您需要在中添加最后两个设置:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="validationQuery" value="SELECT 1 FROM DUAL"/>
<property name="testOnBorrow" value="true"/>
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="10"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
</bean>
下面是为独立应用程序创建BasicDatasource的示例:
http://www.kodejava.org/examples/803.html
一旦你拥有了它,请执行以下操作:
dataSource.setPoolPreparedStatements(true)
dataSource.setMaxOpenPreparedStatements(20);