小代学Spring Boot之数据源
想要获取更多文章可以访问我的博客 - 代码无止境。
经过一天对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之数据源的更多相关文章
- 小代学Spring Boot之集成MyBatis
想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...
- 小代学Spring Boot之自定义Starter
想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...
- 小代学Spring Boot之开篇
想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...
- 小代介绍Spring Boot
想要获取更多文章可以访问我的博客 - 代码无止境. 小代很顺利的完成了陈BOSS交代给他搭建Spring Boot示例程序的任务.但是小代是一个乐于学习的程序员,他通过一番学习总结了一篇简单介绍Spr ...
- (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
- (42)Spring Boot多数据源【从零开始学Spring Boot】
我们在开发过程中可能需要用到多个数据源,我们有一个项目(MySQL)就是和别的项目(SQL Server)混合使用了.其中SQL Server是别的公司开发的,有些基本数据需要从他们平台进行调取,那么 ...
- 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot
项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...
- 65.什么是IOC?【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 这个小节吧,是无意当中看了一篇文章,觉得介绍的特别好,引用到我的博客中,让大家也乐下.那么他是怎么解说IOC的呢?看如下: 套用好莱坞的一句名言就 ...
- 59. Spring Boot Validator校验【从零开始学Spring Boot】
大纲: (1) 入门例子: (2) 国际化: (3) 在代码中添加错误信息: (1) 入门例子: Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数 ...
随机推荐
- 安德鲁斯Toast它们的定义和防止重复显示器
Toast安卓系统,当用户错误或功能运行完成,提示,要求用户,它不集中,并且将在一定时间内消失.然而,在用户继续误(如登录,password错)当次,将有多个Toast创建.系统会把这些toast放进 ...
- openFrameworks 是一个旨在助力你进行开创性工作的开源 C++ 工具箱(是很多其它类库的组合)
openFrameworks 是一个旨在助力你进行开创性工作的开源 C++ 工具箱,提供了简单且直观的实验框架.该工具箱具有常见的工具,并集合了众多常见的库: OpenGL, GLEW, GLUT, ...
- __declspec的15种用法
__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...
- SQLServer 进程无法向表进行大容量复制(错误号: 22018 20253)
原文:SQLServer 进程无法向表进行大容量复制 我的环境:SQL SERVER 2008 R2:发布者 ->SQL SERVER 2017 订阅者 进程无法向表“"dbo&quo ...
- 浏览器中实现3D全景浏览
如果你用过网页版的百度地图,你大概3D全景图浏览是一种怎样的酷炫体验:在一个点可以360度环顾周围的建筑.景色,当然也可以四周移动,就像身临其境. 科普 全景图共分为三种: ①球面全景图 利用一张全景 ...
- webmethod基本认知
六种控件统称flow step insert/invoke 插入services,类似调用函数 BRANCH 分支结构 参数名在switch定义 子参数以label确定 注意:确保label唯一,否则 ...
- Add-AppxProvisionedPackage
原文: Add-AppxProvisionedPackage Adds an app package (.appx) that will install for each new user to a ...
- 通过HTTP Header控制缓存
我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验.HTTP协议中也规定了一些和缓存相关的Header,来允许浏览器或共享高速缓存缓存资源.这些Header包括: Last-Modified ...
- Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...
- Windows Phone 8加载外部动态链接库DLL(非安装包内的)
Windows Phone 8加载外部动态链接库DLL(非安装包内的) 在<动态加载与插件化>中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下. 加载外部DLL主要的原理: ...