SpringBoot+Druid数据库连接池使⽤
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的DataSource基类为:com.alibaba.druid.pool.DruidDataSource。
4. druid使⽤demo
springboot的默认数据源是at.jdbc.pool.DataSource。因为我们在这⾥使⽤的是druid,所以需要修改
pe为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# 驱动配置信息
pe=com.alibaba.druid.pool.DruidDataSource spring.datasource.url = jdbc:mysql://127.0.0.1:3306/myspringboot spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = sql.jdbc.Driver
# 连接池的配置信息
# 初始化⼤⼩,最⼩,最⼤
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进⾏⼀次检测,检测需要关闭的空闲连接,单位是毫秒spring.datasource.timeBetweenEvictionRunsMillis=60000
17 18 19 20 21 22 23 24 25 26 27 28 29# 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1FROM DUAL
stWhileIdle=true
stOnBorrow=false
stOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的⼤⼩
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界⾯sql⽆法统计,'wall'⽤于防⽕墙
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
tionProperties=Sql=true;druid.stat.slowSqlMillis=5000
DataBase配置类:
@Slf4j
@Configuration
public class DataBaseConfiguration {
@Value("${pe}")
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 ---------------------");
ate().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. 访问监控页⾯
6. 数据结果对⽐
在使⽤数据库连接池前后,可以通过在数据库执⾏:show full processlist,判断当前数据库有多少连接数。
在实际项⽬中,在未使⽤数据库连接池时,腾讯云数据库24⼩时的监控如下
使⽤后的连接数
7. 总结
在实际项⽬中,数据库连接池的使⽤是必不可少的。没有采⽤数据库连接池时,系统是按照数据库默认的⽅式保持⼀定的连接数,将⼀定的连接数保持在休眠状态。采⽤druid数据库连接池后,正常保持多少连接数,最⼤保持多少连接数都是可配置的。也有⼀台完整的平台监控整个数据库。
8. 参考
druid连接池配置详解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论