SpringBoot动态数据源 Druid及监控配置

package com.creditcore.services.common.dataSource;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 * springboot集成mybatis的基本入口
 * 1)创建数据源(如果采用的是默认的tomcat-jdbc数据源,则不需要)
 * 2)创建SqlSessionFactory
 * 3)配置事务管理器,除非需要使用事务,否则不用配置
 */
@Configuration // 该注解类似于spring配置文件
// @MapperScan(basePackages = "com.xxx.firstboot.mapper")
@EnableConfigurationProperties(DataSourceConfiguration.class)
public class MyBatisConfig {

    private static final Logger logger = LoggerFactory.getLogger(MyBatisConfig.class);

    // @Autowired
    // private Environment env;

    //    @Value("${info.build.name:Hello default}")
    //    private String projectName;

    @Autowired
    private DataSourceConfiguration dataSourceConfiguration;
    // mybaits mapper xml搜索路径
    private static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    // 从cloud config上读取配置信息,生成数据源Map 定义bean :dataSources
    @Bean
    @Primary
    @ConditionalOnMissingBean(name="dataSources")
    public Map<String, DataSource> dataSources() {
        //System.out.println(projectName);
        List<Map<String, String>> configList = dataSourceConfiguration.getConfiglist();
        Map<String, DataSource> dsMap = new HashMap<String, DataSource>();
        // 配置数据源的相关信息
        for (Map<String, String> configMap : configList) {
            DruidDataSource dataSource = new DruidDataSource();

            dataSource.setDriverClassName(configMap.get("driverClassName"));
            dataSource.setUrl(configMap.get("url"));
            dataSource.setUsername(configMap.get("username"));
            dataSource.setPassword(configMap.get("password"));

            // 配置初始化大小、最小、最大
            dataSource.setInitialSize(Integer.parseInt(configMap.get("initialSize")));
            dataSource.setMinIdle(Integer.parseInt(configMap.get("minIdle")));
            dataSource.setMaxActive(Integer.parseInt(configMap.get("maxActive")));
            // 配置获取连接等待超时的时间
            dataSource.setMaxWait(Integer.parseInt(configMap.get("maxWait")));
            // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            dataSource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(configMap.get("timeBetweenEvictionRunsMillis")));
            // 配置一个连接在池中最小生存的时间,单位是毫秒
            dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(configMap.get("minEvictableIdleTimeMillis")));
            dataSource.setValidationQuery(configMap.get("validationQuery"));
            dataSource.setTestWhileIdle(Boolean.parseBoolean(configMap.get("testWhileIdle")));
            dataSource.setTestOnBorrow(Boolean.parseBoolean(configMap.get("testOnBorrow")));
            dataSource.setTestOnReturn(Boolean.parseBoolean(configMap.get("testOnReturn")));
            // 打开PSCache
            dataSource.setPoolPreparedStatements(Boolean.parseBoolean(configMap.get("poolPreparedStatements")));
            // 指定每个连接上PSCache的大小
            dataSource.setMaxPoolPreparedStatementPerConnectionSize(Integer.parseInt(configMap.get("maxPoolPreparedStatementPerConnectionSize")));
            try {
                // 配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall‘用于防火墙
                dataSource.setFilters(configMap.get("filters"));
            } catch (SQLException e) {
                logger.error("druid configuration initialization filter", e);
            }
            // 通过connectProperties属性来打开mergeSql功能;慢SQL记录
            dataSource.setConnectionProperties(configMap.get("connectionProperties"));
            // 合并多个DruidDataSource的监控数据
            dataSource.setUseGlobalDataSourceStat(true);
            dsMap.put(configMap.get("key"), dataSource);
        }

        return dsMap;
    }

    /**
     * @Primary 该注解表示在同一个接口有多个实现类可以注入的时候,默认选择哪一个,而不是让@autowire注解报错
     * @Qualifier 根据名称进行注入,通常是在具有相同的多个类型的实例的一个注入(例如有多个DataSource类型的实例)
     */

    // 定义bean:dataSource
    // dataSources的值来源于上面定义的dataSources
    @Bean
    @Primary
    public DynamicDataSource dataSource(@Qualifier("dataSources")Map<String, DataSource> dataSources) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        for (String key : dataSources.keySet()) {
            targetDataSources.put(key, dataSources.get(key));
        }

        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);// 该方法是AbstractRoutingDataSource的方法
        dataSource.setDefaultTargetDataSource(targetDataSources.get("default"));// 默认的datasource设置为myTestDbDataSource
        return dataSource;
    }

    /**
     * 根据数据源创建SqlSessionFactory
     */
    // 定义bean:sqlSessionFactory
    // dataSource的值来源于上面定义的dataSource
    @Bean
    public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception {
        SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
        fb.setDataSource(dataSource);// 指定数据源(这个必须有,否则报错)
        // 下边两句仅仅用于*.xml文件,如果整个持久层操作不需要使用到xml文件的话(只用注解就可以搞定),则不加
        // fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));//
        // 指定基包
        try {
            fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));//
        } catch (Exception e) {
            // 有的工程不需要操作DB的没有MAPPER文件,防止启动报错
            e.printStackTrace();
        }

        return fb.getObject();
    }

    /**
     * 配置事务管理器
     */
    @Bean
    public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        //白名单:
        servletRegistrationBean.addInitParameter("allow", "");
        //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
        //登录查看信息的账号密码.
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        //是否能够重置数据.
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

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

}
时间: 2024-10-10 08:59:08

SpringBoot动态数据源 Druid及监控配置的相关文章

springboot中使用druid和监控配置

如果想要监控自己的项目的访问情况及查看配置信息,druid是一个很好的选择,可能你会问druid是什么?有什么用?优点是什么? Druid简介 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能.GitHub地址:https://github.com/alibaba/druid.Druid有以下优点:1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库

SpringBoot:spring boot使用Druid和监控配置

Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource 业界把 Druid 和 HikariCP 做对比后,虽说 HikariCP 的性能比 Druid 高,但是因为 Druid 包括很多维度的统计和分析功能,所以这也是大家都选择使用它的原因. 下面来说明如何在 spring Boot 中配置使用Druid 整体步骤: (1)    ——   Druid简

Spring Boot使用Druid和监控配置

Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. 下面来说明如何在 Spring Boot 中配置使用Druid (1)添加Maven依赖 (或jar包)\ <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId&g

作为Java程序员,你真的了解springboot动态数据源的内幕吗?

做了这么多年的Java程序员,好像使用多数据源的情况非常少,特别是现如今微服务这么火的情况下,不同的业务访问一个数据库是常态,而且Java访问数据源真没有PHP等脚本语言来得那么简单方便,但是在特殊业务情况下,还不得不使用多数据源,今天我们就来讲讲这方面的话题 一.应用案例 我们的数据库A为主库,其他数据库配置在主库中,从库B,C,D的数量是不固定的,会根据业务的需要动态的把配置写入到主库中并动态在创建新的数据库,也就是说在项目中我们只需要配置主库的数据源,其他从库都需要从主库中读出配置并动态创

druid spring监控配置

方法一: <bean id="seckillServiceImpl" class="org.seckill.service.impl.SeckillServiceImpl" ></bean><!-- druid Spring 关联监控 : 切面--><bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.

springboot多数据源+jta事务管理配置

1.创建一个maven项目,导入相关配置: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap

SpringBoot和Mycat动态数据源项目整合

SpringBoot项目整合动态数据源(读写分离) 1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理.由于此方法相对易懂,简单,不做过多介绍. 2. 动态切换数据源,根据配置的文件,业务动态切换访问的数据库:此方案通过Spring的AOP,AspactJ来实现动态织入,通过编程继承实现Spring中的AbstractRoutingDataSource,来实现数据库访问的动态切换,不仅可以方便扩展,

搞定SpringBoot多数据源(2):动态数据源

目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3.2.1 动态数据源配置 3.2.2 动态选择数据源 3.2.3 动态数据源使用 3.3 使用 AOP 选择数据源 3.3.1 定义数据源注解 3.3.2 定义数据源切面 3.3.3 使用 AOP 进行数据源切换 4. 再思考一下 5. 总结 参考资料 往期文章 一句话概括:使用动态数据源对多个数据库

spring 动态数据源

1.动态数据源:  在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理:   (1).spring 单数据源获取数据连接过程: DataSource --> SessionFactory --> Session  DataSouce   实现javax.sql.DateSource接口的数据源,  DataSource  注入SessionFactory, 从sessionFactory 获取 Session,实现数据库的