使用Spring配置apache dbcp PoolingDataSource

时间:2012-05-29 22:58:04

标签: java spring apache-commons-dbcp

试图遵循apache dbcp示例的模式,我理解除了数据库属性的来源和位置以及它们必须放在应用程序上下文中的所有内容之外的所有内容。

我使用的是Spring Data Source,但是我记得我很快就配置了它,我记得在配置apache dbcp本身提供的原始dataSource时遇到了困难。所以我碰巧有时间面对问题并实现使用PoolingDataSource的原始意图。

我使用Spring实现的原因是它提供了设置连接数据库的参数的方法。

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/jdbc/datasource/DriverManagerDataSource.html

根据http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/PoolingDataSource.html

没有方法可以填充url或load driver之类的配置。

我试图通过对象池等跟踪它,但真的迷路了。

预先回复:是的,我不想使用apache basicDataSource。

所以现在我回到这个问题,并不能真正理解在哪里获取参数?驱动程序?网址是什么?似乎在连接工厂上设置了url,pw和username。但是在哪里获取要加载的postgresql驱动程序?

请帮助完成配置。

(使用弹簧进行配置)

<!-- the one I want to use now -->
  <bean id="dataSource" class="org.apache.commons.dbcp.PoolingDataSource">
     <constructor-arg><ref bean="pool"/></constructor-arg>
  </bean>

<!-- the one I used before as a workaround

<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName" value="org.postgresql.Driver"/>
   <property name="url" value="jdbc:postgresql:postgres"/>
   <property name="username" value="magicUserName"/>
   <property name="password" value="magicPassword"/>
</bean>  -->

<bean id="pool" class="org.apache.commons.pool.impl.GenericObjectPool">
   <property name="minEvictableIdleTimeMillis"><value>300000</value </property>
   <property name="timeBetweenEvictionRunsMillis"><value>60000</value </property>
</bean>

<bean id="dsConnectionFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
   <constructor-arg><ref bean="dataSource"/></constructor-arg>
</bean>

<bean id="poolableConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory">
    <constructor-arg index="0"><ref bean="dsConnectionFactory"/ </constructor-arg>
    <constructor-arg index="1"><ref bean="pool"/></constructor-arg>
    <constructor-arg index="2"><null/></constructor-arg>
    <constructor-arg index="3"><null/></constructor-arg>
    <constructor-arg index="4"><value>false</value></constructor-arg>
    <constructor-arg index="5"><value>true</value></constructor-arg>
</bean>



 <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

 <tx:annotation-driven transaction-manager="txManager" />

</beans>

我相信我们只对前两个感兴趣,但为了以防万一,我把所有内容都包括在内。

似乎有很多人使用变通办法: http://forum.springsource.org/showthread.php?10772-How-do-I-create-a-org-apache-commons-dbcp-PoolableConnection

1 个答案:

答案 0 :(得分:0)

您可以配置如下:

  <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="<put database connection url here>" />
    <property name="username" value="XXXXXX" />
    <property name="password" value="XXXXXXXX" />
    <property name="driverClassName" value="<database driver here>" />
</bean>

<bean id="pool" class="org.apache.commons.pool.impl.GenericObjectPool">
    <property name="minEvictableIdleTimeMillis"><value>300000</value></property>
    <property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
</bean>

<bean id="dsConnectionFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
    <constructor-arg><ref bean="dataSource"/></constructor-arg>
</bean>

<bean id="poolableConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory">
    <constructor-arg index="0"><ref bean="dsConnectionFactory"/></constructor-arg>
    <constructor-arg index="1"><ref bean="pool"/></constructor-arg>
    <constructor-arg index="2"><null/></constructor-arg>
    <constructor-arg index="3"><null/></constructor-arg>
    <constructor-arg index="4"><value>false</value></constructor-arg>
    <constructor-arg index="5"><value>true</value></constructor-arg>
</bean>

<bean id="pooledDS" class="org.apache.commons.dbcp.PoolingDataSource" 
                                               depends-on="poolableConnectionFactory">
    <constructor-arg><ref bean="pool"/></constructor-arg>
</bean>

你可以使用&#34; pooledDS&#34; (PoolingDataSource)与任何其他DataSource相同。

另外,我认为您应该只使用BacsicDataSource,您仍然可以通过&#34; initialSize&#34;来配置池中的连接数。和&#34; maxActive&#34;:

<bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="removeAbandoned" value="true"/>
        <property name="initialSize" value="10" />
        <property name="maxActive" value="50" />
    </bean>