小代学Spring Boot之数据源

Posted by 代码无止境 on 2019-07-10

经过一天对Spring Boot的研究,小代同学已经对Spring Boot框架有了一个大概的认识。并且还创建了一个简单的Spring Boot的Web应用程序,如果你还不知道如何创建的话,可以访问《小代学Spring Boot之开篇》这篇文章。下一步陈Boss小代做的是使用Spring Boot项目连接数据库。
相信我们都知道,在连接数据库的时候我们一般都会使用数据库连接池,这样做的好处在于可以重用数据库资源,还可以统一管理数据库连接,避免连接泄露。小代选择的是阿里巴巴的Druid连接池。那么为啥会选择Druid呢?小代给出的解释是下面这样的。

为啥要使用Druid?

首先简单的介绍一下Druid。Druid是阿里巴巴开源的一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等连接池的优点,而且还加入了日志监控,官方文档称其是Java语言中最好的数据库连接池。
那么接下来,我们就来看下小代同学是如何在Spring Boot项目中集成Druid连接池并且实现SQL监控的吧。

添加依赖包

首先第一步小代同学做的是添加Druid相关的依赖包。除了Druid本身之外,还需MySQL连接驱动包。只需要在pom.xml中添加如下内容即可。

1
2
3
4
5
6
7
8
9
10
11
12
<!--连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.28</version>
</dependency>

配置文件

添加依赖包后,小代同学添加连接池相关的配置项。在Spring Boot项目中不再使用XML文件的方式来配置项目,取而代之的是将一些配置项放在application.property文件中(PS:Spring Boot还支持YAML格式的配置文件),小代同学添加的配置项如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 数据库url
spring.datasource.druid.url=jdbc:mysql://localhost:3306/spring_tutorial?useUnicode=true&characterEncoding=UTF-8
# 驱动
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
# 用户名
spring.datasource.druid.username=root
# 密码
spring.datasource.druid.password=123456
# 最大连接数
spring.datasource.druid.max-active=100
# 连接池初始化大小
spring.datasource.druid.initial-size=1
# 获取连接最大等待时间
spring.datasource.druid.max-wait=60000
# 最小连接数
spring.datasource.druid.min-idle=1
# 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 验证链接是否有效的sql
spring.datasource.druid.validation-query=select 'x'
# 空闲时检测连接是否有效
spring.datasource.druid.test-while-idle=true
# 连接被借出时检查是否有效,影响性能,所以此处关闭
spring.datasource.druid.test-on-borrow=false
# 当连接返还时检查连接是否有效,影响性能,默认关闭
spring.datasource.druid.test-on-return=false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle,但是在mysql下建议关闭。
spring.datasource.druid.pool-prepared-statements=false

配置数据源

接下来小代同学要做的就是使用Java Config的方式配置数据源和Druid Web监控。在这一步他先创建了一个类来映射配置文件中配置项的值,如下面代码所示,由于篇幅的原因,在此不全部展示,需要的同学可以从源码中获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidDataSourceProperties {
...
/**
* 数据源名称
*/
private String name;

/**
* 数据库连接url
*/
private String url;
....
}

可以看出来DruidDataSourceProperties的属性名称和上一步定义的配置项是一一对应的,通过@ConfigurationProperties注解将指定前缀的配置项映射到这个类中,并在Spring Boot项目启动的时候初始化一个实例,并交由Spring容器管理。
接下来还需要创建一个Java配置类。数据源的定义以及Druid监控相关的配置将会放在这个配置类中。下面代码只是截取源码部分内容,需要源码的同学点击这里自取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
@EnableConfigurationProperties({ DruidDataSourceProperties.class })
@ConditionalOnProperty(name = "spring.datasource.druid.url")
public class DruidDataSourceConfiguration {
@Autowired
private DruidDataSourceProperties druidDataSourceProperties;

@Bean(name = "druidDataSource", initMethod = "init", destroyMethod = "close")
@ConditionalOnMissingBean(name = "druidDataSource")
public DruidDataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(druidDataSourceProperties.getUrl());
dataSource.setUsername(druidDataSourceProperties.getUsername());
dataSource.setPassword(druidDataSourceProperties.getPassword());
dataSource.setDriverClassName(druidDataSourceProperties.getDriverClassName());
...
}
}

如上代码所示我们只会在配置文件中存在spring.datasource.druid.url这个配置项时才会初始化它里面所有的配置。还可以看出来的是定义数据源的步骤其实很简单,无非就是将配置项中的值一项一项赋值给new出来的数据源对象。创建完数据源之后,还需要实现Druid监控的相关配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Bean
public ServletRegistrationBean druidServlet() {
// 现在要进行druid监控的配置处理操作
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
new StatViewServlet(), "/druid/*");
// 白名单,多个用逗号分割, 如果allow没有配置或者为空,则允许所有访问
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// 黑名单,多个用逗号分割 (共同存在时,deny优先于allow)
servletRegistrationBean.addInitParameter("deny", "192.168.1.110");
// 控制台管理用户名
servletRegistrationBean.addInitParameter("loginUsername", "admin");
// 控制台管理密码
servletRegistrationBean.addInitParameter("loginPassword", "itweknow.cn");
// 是否可以重置数据源,禁用HTML页面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean ;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
filterRegistrationBean.setFilter(new WebStatFilter());
//所有请求进行监控处理
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
return filterRegistrationBean ;
}

从上面的两段代码看,我们定义了一个Servlet和一个Filter,主要设置了访问控制台的白黑名单以及登录的用户名密码,以及Druid拦截的url。

查看效果

经过上面的配置,整个数据源的配置就完成了。接下来我们只需要启动整个项目,然后浏览器访问http://localhost:8080/druid/index.html就可以看到效果了。访问上面的地址后,会进入到Web控制台的登录界面,输入用户名密码后看到如下界面就代表数据源配置成功了。

Druid Web监控页面

结束语

本文主要介绍了如何在Spring Boot项目中使用Druid连接池链接数据库,并且提到了如何配置Druid内置的SQL监控。你可以在Github上找到本文的完整实现,如果您觉得文章写的还可以的话,顺手给个Star,这是对我最好的鼓励。

ps:“学习不止,码不停蹄”,如果你喜欢我的文章,就关注我吧。

扫码关注“代码无止境”