通过上一节 Spring 数据源配置一: 单一数据源 我们了解单一数据源的配置, 这里我们继续多个数据源的配置
如下(applicationContent.xml 内容)
一: Spring 配置:
<!-- MYSQL 配置 --> <bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>${mysql.jdbc.driverClassName}</value></property> <property name="url"><value>${mysql.jdbc.url}</value></property> <property name="username"><value>${mysql.jdbc.username}</value></property> <property name="password"><value>${mysql.jdbc.password}</value></property> </bean> <bean id="mysqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="mysqlDataSource" /> <!-- 指定sqlMapConfig总配置文件,订制的environment在spring容器中不在生效--> <property name="configLocation" value="classpath:mybatis-config-mysql.xml"/> <!--指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可, 当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 --> <property name="mapperLocations"> <list> <value>classpath*:/mysqlmapper/*Mapper.xml</value> </list> </property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.robin.it.permission.dao" /> <!-- optional unless there are multiple session factories defined --> <property name="sqlSessionFactoryBeanName" value="mysqlSessionFactory" /> </bean> <!-- SQL SERVER 配置 --> <bean id="sqlserverDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>${mssql.jdbc.driverClassName}</value></property> <property name="url"><value>${mssql.jdbc.url}</value></property> <property name="username"><value>${mssql.jdbc.username}</value></property> <property name="password"><value>${mssql.jdbc.password}</value></property> </bean> <bean id="sqlserverSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="sqlserverDataSource" /> <!-- 指定sqlMapConfig总配置文件,订制的environment在spring容器中不在生效--> <property name="configLocation" value="classpath:mybatis-config-sqlserver.xml"/> <!--指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可, 当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 --> <property name="mapperLocations"> <list> <value>classpath*:/sqlservermapper/*Mapper.xml</value> </list> </property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.robin.it.mes.dao" /> <!-- optional unless there are multiple session factories defined --> <property name="sqlSessionFactoryBeanName" value="sqlserverSessionFactory" /> </bean>
以上配置,分别设置了两个数据(mysql, sql server), 从黄色高亮来看, 基本做到了以下几点:
1. 数据来源不同(废话,本来就是多数据源),甚至是数据库厂商不同 (体现在database.properties 文件中)
2. mybatis + 数据库分页引擎不同 (体现在 mybatis-config-*.xml 这类文件中)
3. mybastis 对应的XML sql 文件不同 (体现在不同路径 的/*Mapper.xml)
4. mapper 文件路径不同(体现在 MapperScannerConfigurer 下的 com.robin.it.*.dao)
综合以上四点,可以看出,多数据源,基本是单一数据源配置的 ”叠加“ , 只要将上面4点里面提到的内容分离。
二: database.properties 参加: Spring 数据源配置一: 单一数据源
三: mybatis-config-*.xml 的区别在于,数据引擎不同导致的,方言不同
mybatis-config-mysql.xml
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
<property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect"/>
</plugin>
</plugins>
</configuration>
mybatis-config-sqlserver.xml
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
<property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.SQLServerDialect"/>
</plugin>
</plugins>
</configuration>
四: *mapper.xml 的路径不同
=========================================================================================
到此,多数据的配置基本完成, So easy. but....
我们需要解决的几个问题如下:
1. 如果以上2个数据,数据表,结构业务等均不通,那以上配置没有问题(此次没有加入事务),如果是相同的数据源的不同拷贝(如master/ slaver)呢?
那么mapper.xml/ xxxDao/ 等代码都应该完全相同(即以上提到的4点,不做分离,均只有一份), 如何做到切换数据源?
2. 同一个Service 不同方法,如果动态选择数据?(以便做读写分离)
3......
4....
继续想.....