pom依赖

  1. <!-- druid-spring-boot-starter -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid-spring-boot-starter</artifactId>
  5. <version>1.1.17</version>
  6. </dependency>

application.yml文件

spring:
  datasource:
    druid:
      primary:
        driverClassName: oracle.jdbc.OracleDriver
        jdbcUrl: jdbc:oracle:thin:@11.22.33.44:1568/cpdbs
        username: 123456
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 10
        maxActive: 500
        minIdle: 0
        maxWait: 60000
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 30
        timeBetweenEvictionRunsMillis: 18800
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        filters: stat
        #使用非公平锁
        useUnfairLock: true
        removeAbandoned: true
        removeAbandonedTimeout: 1800
        logAbandoned: false
        validationQueryTimeout: 1
        keepAlive: true
      secondary:
        jdbcUrl: jdbc:oracle:thin:@11.22.33.44:1568/cpdbs
        username: 123456
        password: 123456
      tarim:
        jdbcUrl: jdbc:oracle:thin:@11.22.33.44:1568/tlmdbs
        username: 123456
        password: 123456

主数据源配置

@Configuration
@MapperScan(basePackages = "com.pon.oms.mapper.primary", sqlSessionTemplateRef  = "primarySqlSessionTemplate")
public class PrimaryConfig {

    @Value("${spring.datasource.druid.primary.driverClassName}")
    private String driverClass;

    @Value("${spring.datasource.druid.primary.jdbcUrl}")
    private String url;

    @Value("${spring.datasource.druid.primary.username}")
    private String username;

    @Value("${spring.datasource.druid.primary.password}")
    private String password;

    @Value("${spring.datasource.druid.primary.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.druid.primary.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.druid.primary.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.druid.primary.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.druid.primary.poolPreparedStatements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.druid.primary.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.druid.primary.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.primary.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.primary.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.druid.primary.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.primary.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.primary.testOnReturn}")
    private boolean testOnReturn;

    @Value("${spring.datasource.druid.primary.filters}")
    private String filters;

    @Value("${spring.datasource.druid.primary.useUnfairLock}")
    private boolean useUnfairLock;

    @Value("${spring.datasource.druid.primary.removeAbandoned}")
    private boolean removeAbandoned;

    @Value("${spring.datasource.druid.primary.removeAbandonedTimeout}")
    private int removeAbandonedTimeout;

    @Value("${spring.datasource.druid.primary.logAbandoned}")
    private boolean logAbandoned;

    @Value("${spring.datasource.druid.primary.validationQueryTimeout}")
    private int validationQueryTimeout;

    @Value("${spring.datasource.druid.primary.keepAlive}")
    private boolean keepAlive;

    @Bean(name = "primary",initMethod = "init",destroyMethod = "close")
    @Primary//标识主数据源注解
    public DruidDataSource sentinelData() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDbType("oracle");
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxActive(maxActive);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxWait(maxWait);
        dataSource.setPoolPreparedStatements(poolPreparedStatements);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setValidationQuery(validationQuery);
        dataSource.setTestWhileIdle(testWhileIdle);
        dataSource.setTestOnBorrow(testOnBorrow);
        dataSource.setTestOnReturn(testOnReturn);
        dataSource.setUseUnfairLock(useUnfairLock);
        dataSource.setRemoveAbandoned(removeAbandoned);
        dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
        dataSource.setLogAbandoned(logAbandoned);
        dataSource.setValidationQueryTimeout(validationQueryTimeout);
        dataSource.setKeepAlive(keepAlive);
        try {
            dataSource.setFilters(filters);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return dataSource;
    }

    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory sentinelSqlSessionFactory(@Qualifier("primary") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sqlmap/primary/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "primaryTransactionManager")
    @Primary
    public DataSourceTransactionManager sentinelTransactionManager(@Qualifier("primary") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    /**
     * 注册一个StatViewServlet
     * @return
     */
    @Bean
    public ServletRegistrationBean<StatViewServlet> DruidStatViewServle() {
        // org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
        ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<StatViewServlet>
                (new StatViewServlet(), "/druid/*");

        // 添加初始化参数:initParams
        // 白名单:
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");

        // 登录查看信息的账号密码
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin");

        // 是否能够重置数据
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

}

从数据源配置

@Configuration
@MapperScan(basePackages = "com.pon.oms.mapper.secondary", sqlSessionTemplateRef  = "secondarySqlSessionTemplate")
public class SecondaryConfig {

    @Value("${spring.datasource.druid.primary.driverClassName}")
    private String driverClass;

    @Value("${spring.datasource.druid.secondary.jdbcUrl}")
    private String url;

    @Value("${spring.datasource.druid.secondary.username}")
    private String username;

    @Value("${spring.datasource.druid.secondary.password}")
    private String password;

    @Value("${spring.datasource.druid.primary.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.druid.primary.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.druid.primary.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.druid.primary.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.druid.primary.poolPreparedStatements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.druid.primary.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.druid.primary.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.primary.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.primary.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.druid.primary.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.primary.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.primary.testOnReturn}")
    private boolean testOnReturn;

    @Value("${spring.datasource.druid.primary.filters}")
    private String filters;

    @Value("${spring.datasource.druid.primary.useUnfairLock}")
    private boolean useUnfairLock;

    @Value("${spring.datasource.druid.primary.removeAbandoned}")
    private boolean removeAbandoned;

    @Value("${spring.datasource.druid.primary.removeAbandonedTimeout}")
    private int removeAbandonedTimeout;

    @Value("${spring.datasource.druid.primary.logAbandoned}")
    private boolean logAbandoned;

    @Value("${spring.datasource.druid.primary.validationQueryTimeout}")
    private int validationQueryTimeout;

    @Value("${spring.datasource.druid.primary.keepAlive}")
    private boolean keepAlive;

    @Bean(name = "secondary",initMethod = "init",destroyMethod = "close")
    public DruidDataSource outData() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDbType("oracle");
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxActive(maxActive);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxWait(maxWait);
        dataSource.setPoolPreparedStatements(poolPreparedStatements);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setValidationQuery(validationQuery);
        dataSource.setTestWhileIdle(testWhileIdle);
        dataSource.setTestOnBorrow(testOnBorrow);
        dataSource.setTestOnReturn(testOnReturn);
        dataSource.setUseUnfairLock(useUnfairLock);
        dataSource.setRemoveAbandoned(removeAbandoned);
        dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
        dataSource.setLogAbandoned(logAbandoned);
        dataSource.setValidationQueryTimeout(validationQueryTimeout);
        dataSource.setKeepAlive(keepAlive);
        try {
            dataSource.setFilters(filters);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return dataSource;
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory outerSqlSessionFactory(@Qualifier("secondary") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sqlmap/secondary/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "secondaryTransactionManager")
    public DataSourceTransactionManager outerTransactionManager(@Qualifier("secondary") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}