美文网首页
Spring boot 集成 Druid 数据源

Spring boot 集成 Druid 数据源

作者: Maggieq8324 | 来源:发表于2019-08-26 13:22 被阅读0次

    Druid是阿里开源的一个JDBC应用组件,其中包括三部分:

    • DruidDriver:代理Driver,能够提供基于Filter-Chain模式的插件体系。
    • DruidDataSource:高效可管理的数据库连接池。
    • SQLParser:实用SQL语法分析

    官方文档:https://github.com/alibaba/druid/wiki

    依赖

    pom.xml
    • Druid Spring Boot Starter是阿里官方提供的Spring Boot插件,用于在Spring Boot项目中集成Druid数据库连接池和监控
    <!-- druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.9</version>
    </dependency>
    <!-- log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

    配置

    application.yml
    server:
      port: 8001
    
    spring:
      datasource:
        name: druidDataSource
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/coisini?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
          username: root
          password: sunday
          filters: stat,wall,log4j,config
          max-active: 100
          initial-size: 1
          max-wait: 60000
          min-idle: 1
          time-between-eviction-runs-millis: 60000
          min-evictable-idle-time-millis: 300000
          validation-query: select 'x'
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
          pool-prepared-statements: true
          max-open-prepared-statements: 50
          max-pool-prepared-statement-per-connection-size: 20
    
    DruidDataSourceProperties.class
    • 配置类对Druid进行自定义属性配置
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public class DruidDataSourceProperties {
    
        // jdbc
        private String driverClassName;
        private String url;
        private String username;
        private String password;
        // jdbc connection pool
        private int initialSize;
        private int minIdle;
        private int maxActive = 100;
        private long maxWait;
        private long timeBetweenEvictionRunsMillis;
        private long minEvictableIdleTimeMillis;
        private String validationQuery;
        private boolean testWhileIdle;
        private boolean testOnBorrow;
        private boolean testOnReturn;
        private boolean poolPreparedStatements;
        private int maxPoolPreparedStatementPerConnectionSize;
        // filter
        private String filters;
    
        public int getInitialSize() {
            return initialSize;
        }
        public void setInitialSize(int initialSize) {
            this.initialSize = initialSize;
        }
        public int getMinIdle() {
            return minIdle;
        }
        public void setMinIdle(int minIdle) {
            this.minIdle = minIdle;
        }
        public int getMaxActive() {
            return maxActive;
        }
        public void setMaxActive(int maxActive) {
            this.maxActive = maxActive;
        }
        public long getMaxWait() {
            return maxWait;
        }
        public void setMaxWait(long maxWait) {
            this.maxWait = maxWait;
        }
        public long getTimeBetweenEvictionRunsMillis() {
            return timeBetweenEvictionRunsMillis;
        }
        public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
            this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
        }
        public long getMinEvictableIdleTimeMillis() {
            return minEvictableIdleTimeMillis;
        }
        public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
            this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
        }
        public String getValidationQuery() {
            return validationQuery;
        }
        public void setValidationQuery(String validationQuery) {
            this.validationQuery = validationQuery;
        }
        public boolean isTestWhileIdle() {
            return testWhileIdle;
        }
        public void setTestWhileIdle(boolean testWhileIdle) {
            this.testWhileIdle = testWhileIdle;
        }
        public boolean isTestOnBorrow() {
            return testOnBorrow;
        }
        public void setTestOnBorrow(boolean testOnBorrow) {
            this.testOnBorrow = testOnBorrow;
        }
        public boolean isTestOnReturn() {
            return testOnReturn;
        }
        public void setTestOnReturn(boolean testOnReturn) {
            this.testOnReturn = testOnReturn;
        }
        public boolean isPoolPreparedStatements() {
            return poolPreparedStatements;
        }
        public void setPoolPreparedStatements(boolean poolPreparedStatements) {
            this.poolPreparedStatements = poolPreparedStatements;
        }
        public int getMaxPoolPreparedStatementPerConnectionSize() {
            return maxPoolPreparedStatementPerConnectionSize;
        }
        public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
            this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
        }
        public String getFilters() {
            return filters;
        }
        public void setFilters(String filters) {
            this.filters = filters;
        }
        public String getDriverClassName() {
            return driverClassName;
        }
        public void setDriverClassName(String driverClassName) {
            this.driverClassName = driverClassName;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    配置Servlet和Filter

    DruidConfig.class
    • @EnableConfigurationProperties:用于导入Druid的配置信息
    @Configuration
    @EnableConfigurationProperties({DruidDataSourceProperties.class})
    public class DruidConfig {
        @Autowired
        private DruidDataSourceProperties properties;
    
        @Bean
        @ConditionalOnMissingBean
        public DataSource druidDataSource() {
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setDriverClassName(properties.getDriverClassName());
            druidDataSource.setUrl(properties.getUrl());
            druidDataSource.setUsername(properties.getUsername());
            druidDataSource.setPassword(properties.getPassword());
            druidDataSource.setInitialSize(properties.getInitialSize());
            druidDataSource.setMinIdle(properties.getMinIdle());
            druidDataSource.setMaxActive(properties.getMaxActive());
            druidDataSource.setMaxWait(properties.getMaxWait());
            druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
            druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
            druidDataSource.setValidationQuery(properties.getValidationQuery());
            druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
            druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
            druidDataSource.setTestOnReturn(properties.isTestOnReturn());
            druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
            druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
            try {
                druidDataSource.setFilters(properties.getFilters());
                druidDataSource.init();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return druidDataSource;
        }
    
        /**
         * 注册Servlet信息, 配置监控视图
         * @return
         */
        @Bean
        @ConditionalOnMissingBean
        public ServletRegistrationBean<Servlet> druidServlet() {
            ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");
    
            //白名单:
    //        servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");
            //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
            servletRegistrationBean.addInitParameter("deny","192.168.1.119");
            //登录查看信息的账号密码, 用于登录Druid监控后台
            servletRegistrationBean.addInitParameter("loginUsername", "admin");
            servletRegistrationBean.addInitParameter("loginPassword", "admin");
            //是否能够重置数据.
            servletRegistrationBean.addInitParameter("resetEnable", "true");
            return servletRegistrationBean;
        }
    
        /**
         * 注册Filter信息, 监控拦截器
         * @return
         */
        @Bean
        @ConditionalOnMissingBean
        public FilterRegistrationBean<Filter> filterRegistrationBean() {
            FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
            filterRegistrationBean.setFilter(new WebStatFilter());
            filterRegistrationBean.addUrlPatterns("/*");
            filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return filterRegistrationBean;
        }
    }
    
    resources目录下添加log4j参数配置文件
    ### set log levels ###    
    log4j.rootLogger = INFO,DEBUG, console, infoFile, errorFile ,debugfile,mail 
    LocationInfo=true    
    
    log4j.appender.console = org.apache.log4j.ConsoleAppender  
    log4j.appender.console.Target = System.out  
    log4j.appender.console.layout = org.apache.log4j.PatternLayout 
    
    log4j.appender.console.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m   %x %n 
    
    log4j.appender.infoFile = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.infoFile.Threshold = INFO  
    log4j.appender.infoFile.File = C:/logs/log
    log4j.appender.infoFile.DatePattern = '.'yyyy-MM-dd'.log'  
    log4j.appender.infoFile.Append=true
    log4j.appender.infoFile.layout = org.apache.log4j.PatternLayout  
    log4j.appender.infoFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m  %x %n 
    
    log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.errorFile.Threshold = ERROR  
    log4j.appender.errorFile.File = C:/logs/error  
    log4j.appender.errorFile.DatePattern = '.'yyyy-MM-dd'.log'  
    log4j.appender.errorFile.Append=true  
    log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout  
    log4j.appender.errorFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m  %x %n
    
    log4j.appender.debugfile = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.debugfile.Threshold = DEBUG  
    log4j.appender.debugfile.File = C:/logs/debug  
    log4j.appender.debugfile.DatePattern = '.'yyyy-MM-dd'.log'  
    log4j.appender.debugfile.Append=true  
    log4j.appender.debugfile.layout = org.apache.log4j.PatternLayout  
    log4j.appender.debugfile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m  %x %n
    

    编译运行

    • 启动应用,访问http://localhost:8001/druid/login.html,如下:
      在这里插入图片描述
    • 用户名与密码为DriudConfig中配置的登录账号和密码:admin/admin
      在这里插入图片描述

    相关文章

      网友评论

          本文标题:Spring boot 集成 Druid 数据源

          本文链接:https://www.haomeiwen.com/subject/oemrectx.html