想要获取更多文章可以访问我的博客 - 代码无止境

经过一天对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中添加如下内容即可。

<!--连接驱动-->
<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格式的配置文件),小代同学添加的配置项如下所示。

# 数据源类型
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监控。在这一步他先创建了一个类来映射配置文件中配置项的值,如下面代码所示,由于篇幅的原因,在此不全部展示,需要的同学可以从源码中获取

@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidDataSourceProperties {
...
/**
* 数据源名称
*/
private String name; /**
* 数据库连接url
*/
private String url;
....
}

可以看出来DruidDataSourceProperties的属性名称和上一步定义的配置项是一一对应的,通过@ConfigurationProperties注解将指定前缀的配置项映射到这个类中,并在Spring Boot项目启动的时候初始化一个实例,并交由Spring容器管理。

接下来还需要创建一个Java配置类。数据源的定义以及Druid监控相关的配置将会放在这个配置类中。下面代码只是截取源码部分内容,需要源码的同学点击这里自取

@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监控的相关配置。

@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控制台的登录界面,输入用户名密码后看到如下界面就代表数据源配置成功了。

结束语

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

PS:学习不止,码不停蹄!如果您喜欢我的文章,就关注我吧!

小代学Spring Boot之数据源的更多相关文章

  1. 小代学Spring Boot之集成MyBatis

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  2. 小代学Spring Boot之自定义Starter

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  3. 小代学Spring Boot之开篇

    想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...

  4. 小代介绍Spring Boot

    想要获取更多文章可以访问我的博客 - 代码无止境. 小代很顺利的完成了陈BOSS交代给他搭建Spring Boot示例程序的任务.但是小代是一个乐于学习的程序员,他通过一番学习总结了一篇简单介绍Spr ...

  5. (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...

  6. (42)Spring Boot多数据源【从零开始学Spring Boot】

    我们在开发过程中可能需要用到多个数据源,我们有一个项目(MySQL)就是和别的项目(SQL Server)混合使用了.其中SQL Server是别的公司开发的,有些基本数据需要从他们平台进行调取,那么 ...

  7. 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot

    项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...

  8. 65.什么是IOC?【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 这个小节吧,是无意当中看了一篇文章,觉得介绍的特别好,引用到我的博客中,让大家也乐下.那么他是怎么解说IOC的呢?看如下: 套用好莱坞的一句名言就 ...

  9. 59. Spring Boot Validator校验【从零开始学Spring Boot】

    大纲: (1) 入门例子: (2) 国际化: (3) 在代码中添加错误信息: (1) 入门例子: Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数 ...

随机推荐

  1. WPF 寻找数据模板中的元素

    <Window x:Class="Wpf180706.Window11"        xmlns="http://schemas.microsoft.com/wi ...

  2. Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法

    原文:Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法  [函数名称] 肤色检测函数SkinDetectProcess(WriteableBitmap src) [算法说明] ...

  3. System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

    今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0 ...

  4. Visual Studio 2017报表RDLC设计器与工具箱中Report Viewer问题

    原文:VS2017入门 RDLC入门之01 本系列所有内容为网络收集转载,版权为原作者所有. VS2017初始安装后和VS2015一样,都没有ReportDesigner/ReportViewer R ...

  5. 第一次做C++项目的一点小总结

    本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...

  6. Android零基础入门第37节:初识ListView

    原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ...

  7. oh my zsh安装

    引言 最近阿里云搞活动,整了一台服务器,作为Linux的爱好者,又免费,so.......当然不能错过了.以前看到好多炫酷的Linux界面,比如这样的:梦想中…… 通过各种方式得知这是Oh my zs ...

  8. Zookeeper zkui-zookeeper图形化管理工具

    zkui zkui是一个Zookeeper可视化管理工具. Github:https://github.com/DeemOpen/zkui zkui安装 1.Git拉取代码 #git clone ht ...

  9. C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)

    C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面 ...

  10. c# 关于TreeView的一点性能问题

    我们要知道,treeview在新增或删除treeNode的时候会进行重绘,这也就是为什么大量数据的时候,treeview很卡.很慢的原因, 那么我们这样 treeview1.BeginUpdate() ...