1、采用SpringMVC+mybatis
2、动态切换数据源实现,单独测试有效
public class DataSources extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceSwitch.getDataSourceType();
}
}
3、Mybatis不同数据库语言支持实现,单独测试有效
<!--支持多类型数据库配置-->
<bean id="vendorProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="Oracle">oracle</prop>
<prop key="MySQL">mysql</prop>
</props>
</property>
</bean>
<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
<property name="properties" ref="vendorProperties" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource" />
<property name="databaseIdProvider" ref="databaseIdProvider" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
…………
<select id="getTime" resultType="java.lang.String" databaseId="oracle">
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
</select>
<select id="getTime" resultType="java.lang.String" databaseId="mysql">
select now()
</select>
4、动态切换数据源之后再访问带有databaseId的dao方法就无效了。
5、看SqlSessionFactoryBean源码,databaseId相关代码如下
if (this.databaseIdProvider != null) {
try {
configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource));
} catch (SQLException var24) {
throw new NestedIOException("Failed getting a databaseId", var24);
}
}
public String getDatabaseId(DataSource dataSource) {
if (dataSource == null) {
throw new NullPointerException("dataSource cannot be null");
} else {
try {
return this.getDatabaseName(dataSource);
} catch (Exception var3) {
log.error("Could not get a databaseId from dataSource", var3);
return null;
}
}
}
断点跟踪代码,只有启动服务的时候执行一次,切换数据源不执行,跪求求高手告知解决办法。献出全部C币。