Druid简介
Java程序很大一部分要操作数据库,为了进步性能操作数据库的时候,又不得不应用数据库连接池。
Druid 是阿里巴巴开源平台上一个数据库连接池实现,联合了 C3P0、DBCP 等 DB 池的长处,同时退出了日志监控。
Druid 能够很好的监控 DB 池连贯和 SQL 的执行状况,天生就是针对监控而生的 DB 连接池。
Druid曾经在阿里巴巴部署了超过600个利用,通过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认应用 Hikari 数据源,能够说 Hikari 与 Driud 都是以后 Java Web 上最优良的数据源,咱们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github地址:https://github.com/alibaba/dr...
官网wiki:wiki
简略应用
Spring Boot默认的数据源是:
- 2.0之前:
org.apache.tomcat.jdbc.pool.DataSource
- 2.0及之后:
com.zaxxer.hikari.HikariDataSource
在springboot中切换数据源非常简单,只须要在配置文件中指定 spring.datasource.type
为咱们指定的类型就好了。
eg:spring.datassource.type=com.alibaba.druid.pool.DruidDataSource
这样就实现切换咱们的数据源为Druid。这个type的值是DataSource的接口的实现。
Druid各项配置
配置 | 缺省值 | 阐明 |
---|---|---|
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候能够通过名字来辨别开来。如果没有配置,将会生成一个名字,格局是:”DataSource-“ + System.identityHashCode(this). 另外配置此属性至多在1.0.5版本中是不起作用的,强行设置name会出错。 | |
url | 连贯数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 连贯数据库的用户名 | |
password | 连贯数据库的明码。如果你不心愿明码间接写在配置文件中,能够应用ConfigFilter。具体看这里 | |
driverClassName | 依据url自动识别 | 这一项可配可不配,如果不配置druid会依据url自动识别dbType,而后抉择相应的driverClassName |
initialSize | 0 | 初始化时建设物理连贯的个数。初始化产生在显示调用init办法,或者第一次getConnection时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 曾经不再应用,配置了也没成果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连贯时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用偏心锁,并发效率会有所降落,如果须要能够通过配置useUnfairLock属性为true应用非偏心锁。 | |
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,能够把这个数值配置大一些,比如说100 |
validationQuery | 用来检测连贯是否无效的sql,要求是一个查问语句,罕用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 | |
validationQueryTimeout | 单位:秒,检测连贯是否无效的超时工夫。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)办法 | |
testOnBorrow | true | 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。 |
testOnReturn | false | 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。 |
testWhileIdle | false | 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。 |
keepAlive | false (1.0.28) | 连接池中的minIdle数量以内的连贯,闲暇工夫超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 |
timeBetweenEvictionRunsMillis | 1分钟(1.0.14) | 有两个含意: 1) Destroy线程会检测连贯的间隔时间,如果连贯闲暇工夫大于等于minEvictableIdleTimeMillis则敞开物理连贯。 2) testWhileIdle的判断根据,具体看testWhileIdle属性的阐明 |
numTestsPerEvictionRun | 30分钟(1.0.14) | 不再应用,一个DruidDataSource只反对一个EvictionRun |
minEvictableIdleTimeMillis | 连贯放弃闲暇而不被驱赶的最小工夫 | |
connectionInitSqls | 物理连贯初始化的时候执行的sql | |
exceptionSorter | 依据dbType自动识别 | 当数据库抛出一些不可复原的异样时,摈弃连贯 |
filters | 属性类型是字符串,通过别名的形式配置扩大插件,罕用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 进攻sql注入的filter:wall | |
proxyFilters | 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系 |
不应用启动器
- 增加依赖
<!--jdbc--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--Druid--><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.22</version></dependency><!--mysql驱动--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtimen</scope></dependency><!--web--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!--test--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId></dependency>
- 批改配置
咱们只有在配置文件中指定咱们的数据源的类型为Druid就能够切换到Druid:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 username: root password: root # 指定类型为咱们本人的 type: com.alibaba.druid.pool.DruidDataSource
- 测试,打印出数据源
@Testpublic void load(){ System.out.println(dataSource.getClass());}
能够看到:
这就阐明咱们援用胜利了!
配置文件
这是残缺的配置文件,因为不是应用starter,所以属性不会主动拆卸,须要咱们写配置类。
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,须要本人绑定 #druid 数据源专有配置 # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 200 # 配置获取连贯期待超时的工夫 maxWait: 60000 # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连贯在池中最小生存的工夫,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 用来检测连贯是否无效的sql,要求是一个查问语句 validationQuery: SELECT 1 FROM DUAL # 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。 testWhileIdle: true # 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能 testOnBorrow: false # 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。 testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。 poolPreparedStatements: true # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。 max-pool-prepared-statement-per-connection-size: 50 #配置监控统计拦挡的filters,stat:监控统计、log4j:日志记录、wall:进攻sql注入 #如果容许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true # 通过connectProperties属性来关上mergeSql性能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
- 配置类
@Configurationpublic class DruidConfig { /* 将自定义的 Druid数据源增加到容器中,不再让 Spring Boot 主动创立 绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们失效 @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中 前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中 */ @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDataSource() { return new DruidDataSource(); }}
- 测试
咱们通过获取数据源的属性来判断刚刚的设置是否失效
@Test public void contextLoads() throws SQLException { //看一下默认数据源 System.out.println(dataSource.getClass()); //取得连贯 Connection connection = dataSource.getConnection(); System.out.println(connection); DruidDataSource druidDataSource = (DruidDataSource) dataSource; System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive()); System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize()); //敞开连贯 connection.close(); }
能够看到,咱们设置的属性曾经配置进去了:
应用starter启动器
Druid官网已提供启动器了,咱们只有应用启动器,就能实现springboot的主动拆卸,就不须要再通过配置类去注入咱们的bean了。
官网starter教程
- 增加依赖
<!--Druid starter--><dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.22</version></dependency>
- 增加配置
druid中默认的配置都是以spring.datasource.druid.*
结尾的,所以咱们只有在配置文件中配置属性就好就好,不须要再写配置类去绑定配置信息:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource druid: #druid 数据源专有配置 # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 200 # 配置获取连贯期待超时的工夫 maxWait: 60000 # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连贯在池中最小生存的工夫,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 用来检测连贯是否无效的sql,要求是一个查问语句 validationQuery: SELECT 1 FROM DUAL # 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。 testWhileIdle: true # 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能 testOnBorrow: false # 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。 testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。 poolPreparedStatements: true # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。 max-pool-prepared-statement-per-connection-size: 50 #配置监控统计拦挡的filters,stat:监控统计、log4j:日志记录、wall:进攻sql注入 #如果容许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j # 配置监控统计拦挡的filters,去掉后监控界面sql无奈统计,比方不配置stat,咱们在Druid的监控页面中就拿不到想要的信息。 filters: stat,wall,log4j # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true # 通过connectProperties属性来关上mergeSql性能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
这样咱们刚刚的DruidConfig就能够不要了,再次启动测试类,发现也是失常读取到咱们的自定义配置:
这个时候咱们拜访localhost:8080/druid
,就能够进入druid默认的监控控制台。
配置多数据源
参考官网文档即可
配置Druid监控
Druid 数据源具备监控的性能,并提供了一个 web 界面不便用户查看,相似装置 路由器 时,人家也提供了一个默认的 web 页面。然而这个页面默认是所有人都能够拜访,不平安,所以个别咱们都要定制的去设置。
对于Spring Boot有两种配置形式,一种是基于配置类,一种是间接在配置文件中配置。
间接在配置文件中配置
比方间接在配置文件中配置如下,其余的配置也雷同,能够看官网:
# WebStatFilter配置,阐明请参考Druid Wiki,配置_配置WebStatFilter# 次要进行配置哪些申请须要druid监控,哪些不须要spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值falsespring.datasource.druid.web-stat-filter.url-pattern=spring.datasource.druid.web-stat-filter.exclusions=spring.datasource.druid.web-stat-filter.session-stat-enable=spring.datasource.druid.web-stat-filter.session-stat-max-count=spring.datasource.druid.web-stat-filter.principal-session-name=spring.datasource.druid.web-stat-filter.principal-cookie-name=spring.datasource.druid.web-stat-filter.profile-enable=# StatViewServlet配置,阐明请参考Druid Wiki,配置_StatViewServlet配置spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值false#申请门路spring.datasource.druid.stat-view-servlet.url-pattern=spring.datasource.druid.stat-view-servlet.reset-enable=# 设置登录用户spring.datasource.druid.stat-view-servlet.login-username=# 设置登录明码spring.datasource.druid.stat-view-servlet.login-password=# 容许哪些ip拜访spring.datasource.druid.stat-view-servlet.allow=#禁止哪些ip拜访spring.datasource.druid.stat-view-servlet.deny=# Spring监控配置,阐明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置spring.datasource.druid.aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔# 如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true
通过配置类配置
@Configurationpublic class MyConfig { //配置 Druid 监控治理后盾的Servlet;//内置 Servlet 容器时没有web.xml文件,所以应用 Spring Boot 的注册 Servlet 形式 @Bean public ServletRegistrationBean statViewServlet() { ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); // 这些参数能够在 com.alibaba.druid.support.http.StatViewServlet // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到 Map<String, String> initParams = new HashMap<>(); initParams.put("loginUsername", "admin"); //后盾治理界面的登录账号 initParams.put("loginPassword", "123456"); //后盾治理界面的登录明码 //后盾容许谁能够拜访 //initParams.put("allow", "localhost"):示意只有本机能够拜访 //initParams.put("allow", ""):为空或者为null时,示意容许所有拜访 initParams.put("allow", ""); //deny:Druid 后盾回绝谁拜访 //initParams.put("deny", "192.168.1.20");示意禁止此ip拜访 //设置初始化参数 bean.setInitParameters(initParams); return bean; } //配置 Druid 监控 之 web 监控的 filter//WebStatFilter:用于配置Web和Druid数据源之间的治理关联监控统计 @Bean public FilterRegistrationBean webStatFilter() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); //exclusions:设置哪些申请进行过滤排除掉,从而不进行统计 Map<String, String> initParams = new HashMap<>(); initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*"); bean.setInitParameters(initParams); //"/*" 示意过滤所有申请 bean.setUrlPatterns(Arrays.asList("/*")); return bean; }}
其实能够看到,两者的配置是一样的。
如何配置 Filter
你能够通过 spring.datasource.druid.filters=stat,wall,log4j ...
的形式来启用相应的内置Filter,不过这些Filter都是默认配置。如果默认配置不能满足你的需要,你能够放弃这种形式,通过配置文件来配置Filter,上面是例子。
# 配置StatFilter spring.datasource.druid.filter.stat.enabled=truespring.datasource.druid.filter.stat.db-type=h2spring.datasource.druid.filter.stat.log-slow-sql=truespring.datasource.druid.filter.stat.slow-sql-millis=2000# 配置WallFilter spring.datasource.druid.filter.wall.enabled=truespring.datasource.druid.filter.wall.db-type=h2spring.datasource.druid.filter.wall.config.delete-allow=falsespring.datasource.druid.filter.wall.config.drop-table-allow=false# 其余 Filter 配置不再演示
目前为以下 Filter 提供了配置反对,请参考文档或者依据IDE提醒(spring.datasource.druid.filter.*
)进行配置。
- StatFilter
- WallFilter
- ConfigFilter
- EncodingConvertFilter
- Slf4jLogFilter
- Log4jFilter
- Log4j2Filter
- CommonsLogFilter
要想使自定义 Filter 配置失效须要将对应 Filter 的 enabled
设置为 true
,Druid Spring Boot Starter 默认禁用 StatFilter,你也能够将其 enabled
设置为 true
来启用它
参考
官网文档
参考