前言
我们在进行数据访问声明模板和repository之前都需要配置数据源用来连接数据库。数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接。
常见的数据源有很多,比如dbcp,c3p0,druid。目前很多公司使用的是阿里巴巴开源的Druid数据源,因为该数据源不仅能够进行数据访问并且有成套的数据源以及安全监控。接下来就通过SpringBoot整合Druid数据源,并配置对数据源的监控。
实战
首先需要新建一个springboot项目,如何新建springboot项目可以参考之前的文章:SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目,这里需要的依赖文件的配置如下:
<!--引入druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入log4jlog4j日志--> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> 复制代码
关于druid数据源的依赖可以去网址:mvnrepository.com/artifact/co… 。
接下来新建个配置文件格式为yml格式,配置进行数据访问所需要的一些配置信息,下面是整个的yml配置文件的配置信息,具体的参数的信息如注释所示:
spring: datasource: #用户名 username: root #密码 password: 123456 #数据库的url url: jdbc:mysql://localhost:3306/jdbc?serverTimezone=Asia/Shanghai #驱动名称 driver-class-name: com.mysql.cj.jdbc.Driver #对象的类型,这里是druid数据源 type: com.alibaba.druid.pool.DruidDataSource #初始化连接数:默认值 0 initialSize: 5 #最小空闲连接数,默认值 0,当高峰期过后,连接使用的少了,但是连接池还是会为你留着minIdle的连接,以备高峰期再次来临的时候不需要创建连接当高峰期过后,连接使用的少了,但是连接池还是会为你留着minIdle的连接,以备高峰期再次来临的时候不需要创建连接 minIdle: 5 #最大活跃连接数,这个数字不宜设置过大,太多的并发连接对数据库的压力很大,甚至会导致雪崩,这是一定要注意的。但是如果设置过小,而应用的服务线程数有很高,可能会导致有的服务线程拿不到连接,所以服务的线程数和数据库连接数是需要经过配合调整的最大活跃连接数,这个数字不宜设置过大,太多的并发连接对数据库的压力很大,甚至会导致雪崩,这是一定要注意的。但是如果设置过小,而应用的服务线程数有很高,可能会导致有的服务线程拿不到连接,所以服务的线程数和数据库连接数是需要经过配合调整的 maxActive: 20 #最大等待毫秒数, 单位为 ms, 超过时间会出错误信息最大等待毫秒数, 单位为 ms, 超过时间会出错误信息 maxWait: 60000 #每过多少秒运行一次空闲连接回收器,这里设置的是30秒 timeBetweenEvictionRunsMillis: 30000 #连接池中的连接空闲多少时间后被回收,这里设置的是30分钟 minEvictableIdleTimeMillis: 1800000 # 验证使用的SQL语句 validationQuery: SELECT 1 FROM DUAL #指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除. testWhileIdle: true # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnBorrow: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 #testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证,如果获取到了不可用的数据库连接,一般由应用处理异常 testOnReturn: false #是否缓存preparedStatement,即PSCache。PSCache对支持游标的数据库性能提升巨大 poolPreparedStatements: true #最大启用PSCache的数量 maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true #通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 复制代码
接着新建一个Druid的配置类:
@Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") //将druid数据源注入ioc容器 @Bean public DataSource druid(){ return new DruidDataSource(); } //配置Druid的监控 //1、配置管理后台的Servlet @Bean public ServletRegistrationBean DruidServlet(){ ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); Map<String,String> initParams = new HashMap<>(); //druid后台登录的用户名 initParams.put("loginUsername","admin"); //druid后台登录的密码 initParams.put("loginPassword","111111"); //默认就是允许所有访问 initParams.put("allow",""); bean.setInitParameters(initParams); return bean; } //2、配置监控的filter @Bean public FilterRegistrationBean druidStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String,String> initParams = new HashMap<>(); initParams.put("exclusions","*.js,*.css,/druid/*"); bean.setInitParameters(initParams); bean.setUrlPatterns(Arrays.asList("/*")); return bean; } } 复制代码
@ConfigurationProperties注解获取yml配置文件的配置,prefix = "spring.datasource"表示前缀是spring.datasource的配置信息。 到了这一步就已经可以启动项目,看看效果了,启动项目后在浏览器的地址栏输入:
http://localhost:8080/druid/ 复制代码
会跳转到Druid管理后台的登录页面,输入刚刚设置的用户名和密码登录管理后台,即可看到Druid监控的相关信息:
接着测试数据的增删改查,在数据库中新建一个表,并插入数据,如下所示。
然后新建一个controller类,添加从数据库中查询数据的方法:
@Controller public class HelloController { @Autowired JdbcTemplate jdbcTemplate; @ResponseBody @GetMapping("/select") public Map<String,Object> map(){ List<Map<String, Object>> list = jdbcTemplate.queryForList("select * FROM demo"); return list.get(0); } } 复制代码
重新启动SpringBoot项目,并登录Druid后台,可以看到在sql监控下的信息是空的:
然后新建一个标签页,输入请求:
http://localhost:8080/select 复制代码
在去监控后台的sql监控就可以发现已经监控到了刚刚请求中执行的sql语句:
结尾
以上就是如何通过SpringBoot整合Druid数据源以及配置数据源监控,当然Druid的使用不仅仅这些,还需要自己的不断的学习才能掌握更多的知识。