没有相应的RPC接口,一个项目存在多个数据源,不想在代码端自己编写代码切换数据源?
你有可能需要下面的解决方案:
-
多数据源配置
<!-- 数据源1配置 -->
<bean id="dataSourceFor1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db1_url}" />
<property name="username" value="$db1_user}" />
<property name="password" value="${db1_passwd}" />
<property name="maxWait" value="${db1_maxWait}" />
<property name="maxActive" value="28" />
<property name="initialSize" value="2" />
<property name="minIdle" value="0" />
<property name="timeBetweenEvictionRunsMillis" value="300000" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="validationQuery" value="select 1 from dual" />
<property name="filters" value="stat" />
</bean>
<!-- 创建sqlSessionFactory1-->
<bean id="sqlSessionFactoryFor1" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath*:com/**/mapper1/*Mapper*.xml" />
<property name="dataSource" ref="dataSourceFor1" />
</bean>
<!-- 配置扫描器,扫描指定路径的mapper生成数据库操作代理类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="annotationClass" value="javax.annotation.Resource"></property>
<property name="basePackage" value="com.my.***.test.***.mapper1" />
<property name="sqlSessionFactory" ref="sqlSessionFactoryFor1" />
</bean>
<!-- 数据源2配置 -->
<bean id="dataSourceFor2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db2_url}" />
<property name="username" value="$db2_user}" />
<property name="password" value="${db2_passwd}" />
<property name="maxWait" value="${db2_maxWait}" />
<property name="maxActive" value="28" />
<property name="initialSize" value="2" />
<property name="minIdle" value="0" />
<property name="timeBetweenEvictionRunsMillis" value="300000" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="validationQuery" value="select 1 from dual" />
<property name="filters" value="stat" />
</bean>
<!-- 创建sqlSessionFactory2-->
<bean id="sqlSessionFactoryFor2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath*:com/**/mapper2/*Mapper*.xml" />
<property name="dataSource" ref="dataSourceFor2" />
</bean>
<!-- 此处注意使用不同的sqlSessionFactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="annotationClass" value="javax.annotation.Resource"></property>
<property name="basePackage" value="com.my.***.test.***.mapper2" />
<property name="sqlSessionFactory" ref="sqlSessionFactoryFor2" />
</bean>
-
多事物配置
<bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource1"></property>
<qualifier value="datasource1Tx"/>
</bean>
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource2"></property>
<qualifier value="datasource2Tx"/>
</bean>
-
配置事物拦截器
注解方式
在spring-mybatis配置文件中打开注解配置
<!-- 开启 @Transactional 注解-->
<tx:annotation-driven/>
上面的配置已经定义了多个transactional manager,并设置qualifier属性指定不同的值;然后在需要使用@Transactional注解的时候指定TransactionManager的qualifier属性值或者直接使用bean名称,示例如下:
public class TransactionalService {
@Transactional("datasource1Tx")
public void updateSomethingIntoDatasource1() { ... }
@Transactional("datasource2Tx")
public void saveSomethingIntoDatasource2() { ... }
}
/**
另一种方式:
直接使用transactin manager 的bean名字来开启事物。
@Transactional("transactionManager1")
如果是使用@Transactional(),相当于使用缺省的transaction mananger名字,
即:@Transactional("transactionManager")
*/
注意:
上述配置方式只能保证同一数据源的事物的完整性,不保证一个service方法里有对多个数据源更新操作的事物的完整性。
如果一个事物里需要对多个数据源进行更新操作,需要使用到分布式事物,可以参考springmvc+mybatis+atomikos+JTA的实现方案,这里不做详细描述。
来源:oschina
链接:https://my.oschina.net/u/2626713/blog/1570211