首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为dbcp2设置spring配置提供“未链接到池的PoolableConnectionFactory。调用setPool()”。

为dbcp2设置spring配置提供“未链接到池的PoolableConnectionFactory。调用setPool()”。
EN

Stack Overflow用户
提问于 2014-08-20 19:19:13
回答 4查看 13.1K关注 0票数 0

我需要将dbcp2 java设置代码转换为spring。

以下代码按预期工作:

代码语言:javascript
复制
protected  void setupDriver(String connectURI, String username, String password) throws ClassNotFoundException, SQLException{

        //
        // First, we'll create a ConnectionFactory that the
        // pool will use to create Connections.
        // We'll use the DriverManagerConnectionFactory,
        // using the connect string passed in the command line
        // arguments.
        //
        ConnectionFactory connectionFactory =
            new DriverManagerConnectionFactory(connectURI, username, password);

        //
        // Next we'll create the PoolableConnectionFactory, which wraps
        // the "real" Connections created by the ConnectionFactory with
        // the classes that implement the pooling functionality.
        //
        poolableConnectionFactory = 
                new PoolableConnectionFactory(connectionFactory, null);
        logger.info("poolableConnectionFactory created");

        //
        // Now we'll need a ObjectPool that serves as the
        // actual pool of connections.
        //
        // We'll use a GenericObjectPool instance, although
        // any ObjectPool implementation will suffice.
        //        
        connectionPool =
                new GenericObjectPool<PoolableConnection>(poolableConnectionFactory,getPoolConfig());
        logger.info("connectionPool created");

        // Set the factory's pool property to the owning pool
        poolableConnectionFactory.setPool(connectionPool);
        logger.info("connectionPool is set to poolableConnectionFactory");

        //
        // Finally, we create the PoolingDriver itself...
        //
        Class.forName("org.apache.commons.dbcp2.PoolingDriver");
        driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
        logger.info("dbcp2 driver is created");

        //
        // ...and register our pool with it.
        //
        driver.registerPool(poolName,connectionPool);
        logger.info("driver is registered");

        //
        // Now, we create the PoolingDriver itself,
        // passing in the object pool we created.
        //
        dataSource = new PoolingDataSource<PoolableConnection>(connectionPool);       
        logger.info("dataSource is created");

        //
        //Finally we create the JdbcTemplate for sql 
        //operations in DbDAO class
        //
        jdbcTemplate = new JdbcTemplate(dataSource);        
        logger.info("jdbcTemplate is setup");

        logger.info("Finally dbcp2 driver setup is completed!");

    }   

    //Pool initial setup values
    private GenericObjectPoolConfig getPoolConfig(){

            logger.info("Let's create the pool config values");
            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
            poolConfig.setMaxTotal(Integer.parseInt(config.getMaxtotal())); // set number of max connections i.e 25
            poolConfig.setMaxWaitMillis(Long.parseLong(config.getMaxwaitmillis())); //ie. wait for a minute = 60000
            poolConfig.setMaxIdle(Integer.parseInt(config.getMaxidle())); // set max number of idle connections
            /*poolConfig.setTestOnBorrow(true);
            poolConfig.setTestOnReturn(true);*/
            //poolConfig.setTestWhileIdle(true);
            //poolConfig.setTimeBetweenEvictionRunsMillis(10000L);
            //poolConfig.setNumTestsPerEvictionRun(5);
            //poolConfig.setMinEvictableIdleTimeMillis(5000L);

            return poolConfig;
}

这是beans.xml

代码语言:javascript
复制
<!-- ============ Trauma Database Connection Pooling Beans Settings ================== -->  
    <bean id="connectionFactory" class="org.apache.commons.dbcp2.DriverManagerConnectionFactory">
        <constructor-arg index="0"  value="${tir.jdbc.url}" />
        <constructor-arg index="1"  value="${tir.jdbc.username}" />
        <constructor-arg index="2"  value="${tir.jdbc.password}" />
    </bean>
    <!-- Connection Factory -->
    <bean id="poolableConnectionFactory" class="org.apache.commons.dbcp2.PoolableConnectionFactory">
        <constructor-arg index="0" ref="connectionFactory"/>
        <constructor-arg index="1" >  <null/> </constructor-arg>
    </bean>
    <!-- Pool Configs -->
    <bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <property name="maxTotal" value="${pool.maxtotal}"/>
        <property name="maxIdle" value="${pool.maxidle}"/>
        <property name="minIdle" value="${pool.minidle}"/>
        <property name="maxWaitMillis" value="${pool.maxwaitmillis}"/>
    </bean>    
    <!-- Connection Pool -->
    <bean id="connectionPool" class="org.apache.commons.pool2.impl.GenericObjectPool">
        <constructor-arg index="0" ref="poolableConnectionFactory"/>
        <constructor-arg index="1" ref="poolConfig"/>
    </bean>       

    <!-- Datasource gets connection pool -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.PoolingDataSource">
        <constructor-arg ref="connectionPool"/>
    </bean>
    <!-- JdbcTemplate bean gets the datasource -->
    <bean id="jdbcTemplateTIR" class="org.springframework.jdbc.core.JdbcTemplate">  
        <constructor-arg ref="dataSource" />       
    </bean>
    <!-- Finally, we create our Database object bean -->
    <bean id="dbdao" class="edu.uams.dao.impl.DBDAO">
        <property name="jdbcTemplate" ref="jdbcTemplateTIR" />
    </bean>
    <!-- ============= END OF Trauma Database Connection Pooling Settings =========== -->

在这两种情况下,我都可以使用jDBCTemplate对象,但是它提供了以下警告:

org.apache.commons.dbcp2.PoolingDataSource.(PoolingDataSource.java:65) PoolableConnectionFactory未链接到池。调用setPool()来修复配置“”

原因很明显:在我的java代码中,我设置了

代码语言:javascript
复制
poolableConnectionFactory.setPool(connectionPool);

如何从bean调用setPool方法?

如何在我的bean中设置这个java代码?DriverManagerConnectionFactory的构造函数没有得到DriverClassName的任何构造函数?

代码语言:javascript
复制
            // Finally, we create the PoolingDriver itself...
            //
            Class.forName("org.apache.commons.dbcp2.PoolingDriver");
            driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
            logger.info("dbcp2 driver is created");

            //
            // ...and register our pool with it.
            //
            driver.registerPool(poolName,connectionPool);
EN

回答 4

Stack Overflow用户

发布于 2014-12-03 14:53:02

如果您只使用org.apache.commons.dbcp2.BasicDataSource,难道不是更容易吗?根据文档,它为基本连接池提供了“一站式购物”解决方案。

代码语言:javascript
复制
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="${db.driver}"/>
    <property name="url" value="${db.jdbcurl}"/>
    <property name="username" value="${db.username}"/>
    <property name="password" value="${db.password}"/>
    <property name="initialSize" value="3"/>
</bean> 
票数 6
EN

Stack Overflow用户

发布于 2015-05-26 06:46:47

我正在寻找一个解决这个问题的方法,这个问题是用这些特定版本的库给出的。我使用了您提供的Spring配置,并对其进行了一些调整,使其能够正常工作。这是我如何使用它..。

代码语言:javascript
复制
<bean id="poolingDataSourceBean" class="org.apache.commons.dbcp2.PoolingDataSource">
    <constructor-arg>
        <bean id="genericObjectPoolBean" class="org.apache.commons.pool2.impl.GenericObjectPool">
            <constructor-arg>
                <bean id="poolableConnectionFactoryBean" class="org.apache.commons.dbcp2.PoolableConnectionFactory">
                    <constructor-arg index="0">
                        <bean id="dataSourceConnectionFactoryBean" class="org.apache.commons.dbcp2.DataSourceConnectionFactory">
                            <constructor-arg>
                                <bean id="dataSourceBean" class="net.sourceforge.jtds.jdbcx.JtdsDataSource">
                                    <property name="serverName" value="${database.server}"/>
                                    <property name="portNumber" value="${database.port}"/>
                                    <property name="databaseName" value="${database.name}"/>
                                    <property name="user" value="${database.user}"/>
                                    <property name="password" value="${database.password}"/>
                                </bean>
                            </constructor-arg>
                        </bean>
                    </constructor-arg>
                    <constructor-arg index="1"><null/></constructor-arg>
                </bean>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>
票数 0
EN

Stack Overflow用户

发布于 2015-08-28 00:09:50

您将得到没有链接到池的PoolableConnectionFactory。调用setPool()来修复配置“警告”,因为PoolingDataSource有池定义,而PoolableConnectionFactory没有定义。使用spring,您会遇到循环依赖: PoolableConnectionFactory需要在构造函数中需要PoolableConnectionFactory的GenericObjectPool。

解决这个问题的一种方法是使用MethodInvokingFactoryBean (或者在spring 4.0+中使用MethodInvokingBean ):

代码语言:javascript
复制
<bean id="connectionPoolSetter" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >
    <property name="targetObject" ref="poolableConnectionFactory" />
    <property name="targetMethod" value="setPool"/>
    <property name="arguments" ref="connectionPool" />
</bean>

然后将依赖项属性添加到dataSource,以确保初始化了connectionPoolSetter:

代码语言:javascript
复制
<bean id="dataSource" class="org.apache.commons.dbcp2.PoolingDataSource" depends-on="connectionPoolSetter">
    <constructor-arg ref="connectionPool"/>
</bean>

检查池数据源示例代码:http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/PoolingDataSourceExample.java?view=markup

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25412778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档