1

我有一个如下的弹簧数据源,在具有自己的弹簧上下文的核心模块中,我不想设置 maxActivetime

<bean id="wssModelDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
    <property name="url" value="com.wss.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://x-x2/x_control_QA;appName=wss;sendStringParametersAsUnicode=false;loginTimeout=20;socketTimeout=180"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>
  </bean>

我有依赖模块,它依赖于核心模块,它有自己的 spring 上下文,在这个组件中我想设置数据源 maxIdle 时间

<property name="wssModelDataSource.maxIdle" value="40"/>

还有许多其他模块也依赖于 wssModelDataSource 但我不想为它们更改 maxIdle 时间。

我的问题是,如果我把它放在<property name="wssModelDataSource.maxIdle" value="40"/>spring 上下文文件的根目录下,它会给我错误

4

2 回答 2

2

您可以改为这样做:

定义一个带有通用 props 的抽象基 bean:

<bean id="baseDatasource" abstract="true" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
    <property name="url" value="com.wss.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://x-x2/x_control_QA;appName=wss;sendStringParametersAsUnicode=false;loginTimeout=20;socketTimeout=180"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>

  </bean>

现在定义您的子数据源,并根据需要进行特定修改:

<bean id="wssModelDataSource" parent="baseDatasource">
    <property name="maxIdle" value="40">
</bean>
于 2012-10-16T19:26:00.373 回答
2
<bean class="com.wss.spring.DataSourcePropertyOverrider" >
    <property name="maxIdle" value="#{com.wss.jdbc.MaximumIdleConnections}"/>
    <property name="minIdle" value="#{com.wss.jdbc.MinimumIdleConnections}"/>
    <property name="initialSize" value="#{com.wss.jdbc.InitConnectionSize}"/>
      </bean>

创建 BeanFactoryPostProcessor 实现并覆盖 postProcessBeanFactory 方法

public class DataSourcePropertyOverrider implements BeanFactoryPostProcessor {

    private int maxIdle;
    private int minIdle;
    private int initialSize ;
    /**
     *
     * @param beanFactory
     * @throws BeansException
     */
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BasicDataSource dataSource  = (BasicDataSource)beanFactory.getBean("wssModelDataSource");

        if(dataSource != null){
            dataSource.setMaxIdle(maxIdle);
            dataSource.setMinIdle(minIdle);
            dataSource.setInitialSize(initialSize);
        }

        //To change body of implemented methods use File | Settings | File Templates.
    }


    public int getMaxIdle() {
        return maxIdle;
    }

    public void setMaxIdle(int maxIdle) {
        this.maxIdle = maxIdle;
    }

    public void setMinIdle(int minIdle) {
        this.minIdle = minIdle;
    }

    public int getMinIdle() {

        return minIdle;
    }

    public int getInitialSize() {
        return initialSize;
    }

    public void setInitialSize(int initialSize) {
        this.initialSize = initialSize;
    }
}
于 2012-10-16T20:02:07.923 回答