SpringBoot+Druid
1. 为什么要使用数据库连接池
使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。
而采用数据库连接池之后,首先就创建了固定数量的数据库连接,需要用的时候使用即可。当然,这样做的一个缺点是,可能某些时候完全没有数据库请求,但是也保持了数据库的最小连接数。浪费了资源。不过这种浪费资源相对于完全不采用数据库连接池还是很有优势的。
2. 常见的数据库连接池
常见的数据库连接池主要有c3p0,dbcp,tomcat-jdbc-pool,druid,HiKariCP。
c3p0
来源于《星球大战》中的一个机器人名称,同时这个名称也包含connection pool中的英文字母。不提供对数据库的监控。使用时是单线程的。
dbcp
(database connection pool)是Apache基金会下面的数据库连接池,同时也是tomcat7.0以前的内置数据库连接池(tomcat也是apache基金会下)。独立使用时,需要提供common-dbcp.jar,common-pool.jar,common-connection.jar这三个包。不提供数据库的监控。使用时是单线程的。
tomcat jdbc pool
这个是tomcat7.0后新增的数据库连接池,它兼容dbcp。但是比dbcp性能更高。
druid
是阿里巴巴开源的数据库连接池,提供对数据库的监控,就是为监控而生。它的功能最为全面,可扩展性好,具有sql拦截的功能。
HiKariCP
是数据库连接池里面的后起之秀,出来的比较往,但是性能很好。
总的来说:性能方面HiKariCP>druid>tomcat jdbc pool>dbcp>c3p0(参考),因为我这边要选择可以监控数据库的,所以选择了druid。
3. druid配置详解
druid的详细源码可以从 https://github.com/alibaba/druid进行下载。
druid的DataSource基类为:com.alibaba.druid.pool.DruidDataSource。
4. druid使用demo
springboot的默认数据源是org.apache.tomcat.jdbc.pool.DataSource。因为我们在这里使用的是druid,所以需要修改spring.datasource.type为druid。
1. 引入依赖
新建springboot项目,引入必要的依赖;再添加以下的依赖。
<!-- MySQL Driver驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot的JPA依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 阿里系的Druid依赖包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
2. 添加配置文件
虽然spring boot可以不用配置xml,但是也并不是完全不需要配置文件,当然不用配置文件也能跑起来。
对于配置文件,我不太喜欢.yml
,虽然它比较简洁,但使用.yml
时,属性名的值和冒号中间必须有空格!如:name: rui
才是正确的,name:rui
将读取不出来。
于application.properties
添加以下信息:
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 |
|
DataBase配置类:
@Slf4j
@Configuration
public class DataBaseConfiguration {
@Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType;
/**
* 默认写数据库
* @return
*/
@Bean(name="writeDataSource", destroyMethod = "close", initMethod="init")
@Primary //在同样的DataSource中,首先使用被标注的DataSource
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource writeDataSource() {
log.info("-------------------- writeDataSource init ---------------------");
return DataSourceBuilder.create().type(dataSourceType).build();
}
}
@Bean
声明,DataSource 对象为 Spring 容器所管理; @Primary
表示这里定义的DataSource将覆盖其他来源的DataSource。
- Druid的Servlet与拦截器(用于查看Druid监控)
(这两个类好像由开发团队提供了样例,所以直接使用网上资源,只需修改为自己想要的参数即可)
Druid的Servlet:
@WebServlet(urlPatterns="/druid/*",
initParams={
@WebInitParam(name="allow",value="127.0.0.1"),// IP白名单(没有配置或者为空,则允许所有访问)
@WebInitParam(name="deny",value="192.168.1.73"),// IP黑名单 (存在共同时,deny优先于allow)
@WebInitParam(name="loginUsername",value="admin"),// 用户名
@WebInitParam(name="loginPassword",value="123456"),// 密码
@WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewServlet {
}
Druid的拦截器:
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",
initParams={
@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源 })
public class DruidStatFilter extends WebStatFilter {
}
5. 访问监控页面
访问监控页面http://ip:port/druid/index.html
6. 数据结果对比
在使用数据库连接池前后,可以通过在数据库执行:show full processlist,判断当前数据库有多少连接数。
在实际项目中,在未使用数据库连接池时,腾讯云数据库24小时的监控如下
使用后的连接数
7. 总结
在实际项目中,数据库连接池的使用是必不可少的。没有采用数据库连接池时,系统是按照数据库默认的方式保持一定的连接数,将一定的连接数保持在休眠状态。采用druid数据库连接池后,正常保持多少连接数,最大保持多少连接数都是可配置的。也有一台完整的平台监控整个数据库。