数据库主从分离通常有几类实现方式,一是在应用程序内区分主从,二是新增一层数据库代理服务器,在应用服务器和数据库服务器之间根据SQL区分主从。
前者的好处是可以不用新增额外的服务器开销,后者的好处是可以不用对项目程序逻辑做任何的改动。
而从应用程序内部区分主从,又有两种方式,一是根据包名区分,二是根据自定义注解区分。
一、根据包名区分主从
根据包名区分大概就是把操作主库的Mapper和xml文件放到一类文件夹上,把查询从库的Mapper和xml文件放在另一个目录的文件夹下。
里面的关键点在于MasterDataSourceConfig和ClusterDataSourceConfig,这两个用于声明和扫描对于目录下的dao和mapper.xml文件,并且返回对于的数据库链接,具体代码如下:
package com.tlgg.druid;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* 从库数据源配置
*/
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = ClusterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class ClusterDataSourceConfig {
/**
* 精确到 cluster 目录,以