首页 > 编程 > Java > 正文

Spring boot 集成 Druid 数据源过程详解

2019-11-26 08:40:20
字体:
来源:转载
供稿:网友

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: 8001spring: 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;  }}

Druid Spring Starter简化了很多配置,如果默认配置不满足你的需求,可以自定义配置,参考文档:

https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

配置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/loglog4j.appender.infoFile.DatePattern = '.'yyyy-MM-dd'.log' log4j.appender.infoFile.Append=truelog4j.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 %nlog4j.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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表