1.application.properties
#CMS数据源(主库) spring.datasource.cms.driver-class-name=com.mysql.jdbc.Driver spring.datasource.cms.url=jdbc:mysql://192.168.2.21:3306/cms?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull spring.datasource.cms.username=root spring.datasource.cms.password=root123!@# spring.datasource.cms.max-active=20 spring.datasource.cms.initial-size=1 spring.datasource.cms.min-idle=3 spring.datasource.cms.max-wait=60000 spring.datasource.cms.time-between-eviction-runs-millis=60000 spring.datasource.cms.min-evictable-idle-time-millis=300000 spring.datasource.cms.test-while-idle=true spring.datasource.cms.test-on-borrow=false spring.datasource.cms.test-on-return=false spring.datasource.cms.poolPreparedStatements=true spring.datasource.cms.filters=stat,wall,slf4j #BASE数据源 spring.datasource.base.driver-class-name=com.mysql.jdbc.Driver spring.datasource.base.url=jdbc:mysql://192.168.2.21:3306/base?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull spring.datasource.base.username=root spring.datasource.base.password=root123!@# spring.datasource.base.max-active=20 spring.datasource.base.initial-size=1 spring.datasource.base.min-idle=3 spring.datasource.base.max-wait=60000 spring.datasource.base.time-between-eviction-runs-millis=60000 spring.datasource.base.min-evictable-idle-time-millis=300000 spring.datasource.base.test-while-idle=true spring.datasource.base.test-on-borrow=false spring.datasource.base.test-on-return=false spring.datasource.base.poolPreparedStatements=true spring.datasource.base.filters=stat,wall,slf4j
2.配置主数据源
import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.alibaba.druid.pool.DruidDataSource; import net.common.utils.constant.ConstantCms; @Configuration @EnableTransactionManagement @MapperScan(basePackages = ConstantCms.MAPPER_PACKAGE, sqlSessionTemplateRef = "cmsSqlSessionTemplate") public class ConfigCmsDataSource implements EnvironmentAware { private Logger logger = LoggerFactory.getLogger(ConfigCmsDataSource.class); private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment env) { this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.cms."); } @Bean(name = "cmsDataSource") @Primary public DataSource cmsDataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(propertyResolver.getProperty("url")); datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name")); datasource.setUsername(propertyResolver.getProperty("username")); datasource.setPassword(propertyResolver.getProperty("password")); if (StringUtils.isNotBlank(propertyResolver.getProperty("initial-size"))) { datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initial-size"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("min-idle"))) { datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("min-idle"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("max-wait"))) { datasource.setMaxWait(Integer.valueOf(propertyResolver.getProperty("max-wait"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("max-active"))) { datasource.setMaxActive((Integer.valueOf(propertyResolver.getProperty("max-active")))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("min-evictable-idle-time-millis"))) { datasource.setMinEvictableIdleTimeMillis( Integer.valueOf(propertyResolver.getProperty("min-evictable-idle-time-millis"))); } try { datasource.setFilters("stat,wall"); } catch (SQLException e) { logger.error("初始化BASE数据库连接池发生异常:{}", e.toString()); } return datasource; } @Bean(name = "cmsSqlSessionFactory") @Primary public SqlSessionFactory cmsSqlSessionFactory(@Qualifier("cmsDataSource") DataSource cmsDataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(cmsDataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(ConstantCms.MAPPER_XML_PACKAGE)); return bean.getObject(); } @Bean(name = "cmsTransactionManager") @Primary public DataSourceTransactionManager cmsTransactionManager(@Qualifier("cmsDataSource") DataSource cmsDataSource) { return new DataSourceTransactionManager(cmsDataSource); } @Bean(name = "cmsSqlSessionTemplate") @Primary public SqlSessionTemplate cmsSqlSessionTemplate( @Qualifier("cmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
2.配置从数据源:没有 @Primary
import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.alibaba.druid.pool.DruidDataSource; import net.common.utils.constant.ConstantBase; @Configuration @EnableTransactionManagement @MapperScan(basePackages = ConstantBase.MAPPER_PACKAGE, sqlSessionTemplateRef = "baseSqlSessionTemplate") public class ConfigBaseDataSource implements EnvironmentAware { private Logger logger = LoggerFactory.getLogger(ConfigBaseDataSource.class); private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment env) { this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.base."); } @Bean(name = "baseDataSource") public DataSource baseDataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(propertyResolver.getProperty("url")); datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name")); datasource.setUsername(propertyResolver.getProperty("username")); datasource.setPassword(propertyResolver.getProperty("password")); if (StringUtils.isNotBlank(propertyResolver.getProperty("initial-size"))) { datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initial-size"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("min-idle"))) { datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("min-idle"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("max-wait"))) { datasource.setMaxWait(Integer.valueOf(propertyResolver.getProperty("max-wait"))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("max-active"))) { datasource.setMaxActive((Integer.valueOf(propertyResolver.getProperty("max-active")))); } if (StringUtils.isNotBlank(propertyResolver.getProperty("min-evictable-idle-time-millis"))) { datasource.setMinEvictableIdleTimeMillis( Integer.valueOf(propertyResolver.getProperty("min-evictable-idle-time-millis"))); } try { datasource.setFilters("stat,wall"); } catch (SQLException e) { logger.error("初始化BASE数据库连接池发生异常:{}", e.toString()); } return datasource; } @Bean(name = "baseSqlSessionFactory") public SqlSessionFactory baseSqlSessionFactory(@Qualifier("baseDataSource") DataSource baseDataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(baseDataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(ConstantBase.MAPPER_XML_PACKAGE)); return bean.getObject(); } @Bean(name = "baseTransactionManager") public DataSourceTransactionManager baseTransactionManager(@Qualifier("baseDataSource") DataSource baseDataSource) { return new DataSourceTransactionManager(baseDataSource); } @Bean(name = "baseSqlSessionTemplate") public SqlSessionTemplate baseSqlSessionTemplate( @Qualifier("baseSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
3.注意扫描包路径和XML路径,红色标注部分,改成自己的。
其中XML路径:classpath*:net/common/cms/mapper/xml/**/*.xml,第一个星号必不可少。