我有一个spring数据源如下,在核心模块中有自己的spring上下文我不想设置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>
我有依赖模块,它取决于具有自己的弹簧上下文的核心模块,在这个组件中我想设置数据源maxIdle时间
<property name="wssModelDataSource.maxIdle" value="40"/>
还有许多其他模块也依赖于wssModelDataSource,但我不想为它们改变maxIdle时间。
我的问题是,如果我将<property name="wssModelDataSource.maxIdle" value="40"/>
放在spring上下文文件的根目录下,则会给出错误
答案 0 :(得分:2)
你可以这样做:
使用常见的道具定义一个抽象的基础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>
答案 1 :(得分: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;
}
}