zoukankan      html  css  js  c++  java
  • Spring boot 集成 Druid 数据源

    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
      在这里插入图片描述

  • 相关阅读:
    Mybatis配置数据库连接
    C# 解决httplistener querystring 中文乱码、返回json中文格式乱码
    C# Base64加解密、MD5加密
    C# 获取时间戳并从10进制时间戳转换成16进制byte数组
    win10删除文件夹需要Administrator权限
    WordPress所有页面404 分类页面导航也找不到文章
    Maven配置阿里云镜像
    Hexo部署GitHub Pages
    Linux常用命令集合
    jmeter性能测试入门使用参数化
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/11414684.html
Copyright © 2011-2022 走看看