druid配置数据源

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.xxx.xxx.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
public class DruidDatesourceConfig {

    @Value("${druid.driverClass:com.mysql.jdbc.Driver}")
    private String driverClass;

    @Value("${druid.jdbcUrl}")
    private String jdbcUrl;

    @Value("${druid.user}")
    private String user;

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

    @Value("${druid.initialSize:3}")
    private int initialSize;

    @Value("${druid.minIdle:3}")
    private int minIdle;

    @Value("${druid.maxActive:10}")
    private int maxActive;

    @Value("${druid.maxWait:60000}")
    private long maxWait;

    @Value("${druid.timeBetweenEvictionRunsMillis:60000}")
    private long timeBetweenEvictionRunsMillis;

    @Value("${druid.minEvictableIdleTimeMillis:300000}")
    private long minEvictableIdleTimeMillis;

    @Value("${druid.validationQuery:select 1 from dual}")
    private String validationQuery;

    @Value("${druid.testWhileIdle:true}")
    private boolean testWhileIdle;

    @Value("${druid.testOnBorrow:false}")
    private boolean testOnBorrow;

    @Value("${druid.testOnReturn:false}")
    private boolean testOnReturn;

    @Value("${druid.poolPreparedStatements:false}")
    //打开PSCache,并且指定每个连接上PSCache的大小
    private boolean poolPreparedStatements;

    @Value("${druid.maxPoolPreparedStatementPerConnectionSize:20}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${druid.filters:stat,wall,slf4j}")
    //配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    //@Value("${druid.filters:stat,slf4j}") 关闭防火墙
    private String filters;

    @Value("${druid.connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000}")
    //通过connectProperties属性来打开mergeSql功能;慢SQL记录
    private String connectionProperties;

    @Value("${druid.useGlobalDataSourceStat:true}")
    //合并多个DruidDataSource的监控数据
    private boolean useGlobalDataSourceStat;

    @Bean(initMethod = "init",destroyMethod = "close")
    public DataSource dataSource() {

        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(jdbcUrl);
        datasource.setUsername(user);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClass);

        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);

        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            System.err.println("druid configuration initialization filter: " + e);
        }
        datasource.setConnectionProperties(connectionProperties);
        return datasource;

//        DruidDataSource druidDataSource = new DruidDataSource();
//        druidDataSource.setUrl(jdbcUrl);
//        druidDataSource.setUsername(user);
//        druidDataSource.setPassword(password);
//
//        druidDataSource.setInitialSize(initialSize);
//        druidDataSource.setMinIdle(minIdle);
//        druidDataSource.setMaxActive(maxActive);
//
//        //配置获取连接等待超时的时间
//        druidDataSource.setMaxWait(maxWait);
//
//        //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
//        druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//
//        //配置一个连接在池中最小生存的时间,单位是毫秒
//        druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//
//        druidDataSource.setValidationQuery(validationQuery);
//
//        druidDataSource.setTestWhileIdle(testWhileIdle);
//        druidDataSource.setTestOnBorrow(testOnBorrow);
//        druidDataSource.setTestOnReturn(testOnReturn);
//
//        druidDataSource.setPoolPreparedStatements(poolPreparedStatements);
//        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
//
//        return druidDataSource;
    }


    @Bean(value = "sqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
        return sqlSessionTemplate;
    }

    @Autowired
    @Qualifier("masterPageInterceptor")
    PageInterceptor pageInterceptor;


    @Bean(value = "sqlSessionFactory")
    public MybatisSqlSessionFactoryBean sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.xxx.xxx.dao.mapper,com.xxx.xxx.dao.repository");
        String[] mapperLocations = new String[2];
        mapperLocations[0] = "classpath*:com/xxx/xxx/dao/mapper/**/*Mapper.xml";
        mapperLocations[1] = "classpath*:com/xxx/xxx/dao/repository/**/*.xml";
        sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations(mapperLocations));
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageInterceptor});
        return sqlSessionFactoryBean;
    }

    public Resource[] resolveMapperLocations(String[] mapperLocations) {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = new ArrayList<Resource>();
        if (mapperLocations != null) {
            for (String mapperLocation : mapperLocations) {
                try {
                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
                    resources.addAll(Arrays.asList(mappers));
                } catch (IOException e) {
                    // ignore
                }
            }
        }
        return resources.toArray(new Resource[resources.size()]);
    }

    @Bean(value = "transactionTemplate")
    public TransactionTemplate transactionTemplate(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) {
        TransactionTemplate transactionTemplate = new TransactionTemplate();
        transactionTemplate.setTransactionManager(transactionManager);
        return transactionTemplate;
    }

    @Bean(value = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
}

注意点:如果需要一次执行多条sql语句(&allowMultiQueries=true)需要关闭防火墙安全配置否则会有异常
 


    @Bean(name = "wallConfig")
    WallConfig wallFilterConfig() {
        WallConfig wc = new WallConfig();
        //允许一次执行多条s'q'l语句
        wc.setMultiStatementAllow(true);
        wc.setNoneBaseStatementAllow(true);
        return wc;
    }

    @Bean(name = "wallFilter")
    @DependsOn("wallConfig")
    WallFilter wallFilter(WallConfig wallConfig) {
        WallFilter wfilter = new WallFilter();
        wfilter.setConfig(wallConfig);
        return wfilter;
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Druid配置数据源来实现在一个应用程序中连接多个数据库。以下是一种常见的配置方式: 1. 在application.properties(或application.yml)文件中添加以下配置: ```yaml # 第一个数据源 spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=db1_user spring.datasource.password=db1_password spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 第二个数据源 spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2 spring.datasource.secondary.username=db2_user spring.datasource.secondary.password=db2_password spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver ``` 2. 创建两个数据源配置类,分别对应第一个和第二个数据源: ```java @Configuration @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceConfig { private String url; private String username; private String password; private String driverClassName; // Getter and Setter methods } @Configuration @ConfigurationProperties(prefix = "spring.datasource.secondary") public class SecondaryDataSourceConfig { private String url; private String username; private String password; private String driverClassName; // Getter and Setter methods } ``` 3. 创建Druid数据源配置类: ```java @Configuration public class DruidConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(DataSourceConfig dataSourceConfig) { DruidDataSource druidDataSource = new DruidDataSource(); // 设置数据源属性 druidDataSource.setUrl(dataSourceConfig.getUrl()); druidDataSource.setUsername(dataSourceConfig.getUsername()); druidDataSource.setPassword(dataSourceConfig.getPassword()); druidDataSource.setDriverClassName(dataSourceConfig.getDriverClassName()); // 其他配置... return druidDataSource; } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource(SecondaryDataSourceConfig secondaryDataSourceConfig) { DruidDataSource druidDataSource = new DruidDataSource(); // 设置数据源属性 druidDataSource.setUrl(secondaryDataSourceConfig.getUrl()); druidDataSource.setUsername(secondaryDataSourceConfig.getUsername()); druidDataSource.setPassword(secondaryDataSourceConfig.getPassword()); druidDataSource.setDriverClassName(secondaryDataSourceConfig.getDriverClassName()); // 其他配置... return druidDataSource; } } ``` 4. 在需要使用不同数据源的地方,使用`@Qualifier`注解指定要使用的数据源: ```java @Service public class MyService { @Autowired @Qualifier("dataSource") private DataSource dataSource; @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; // 使用数据源进行操作... } ``` 这样就可以在应用程序中使用多个数据源了。请根据您的具体需求进行配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值