SpringBoot集成Druid连接池
1. 数据源
数据源(DataSource)是由SUN公司定义的用于获取数据库连接的JDBC规范接口
它位于javax.sql包中,用来代替DriverManager的方式来获取连接
package javax.sql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
// 省略注释
public interface DataSourceextends CommonDataSource, Wrapper {Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
使用数据源可以直接获取数据库的连接对象,不需要再编写数据库的代码。
2. 数据库连接池
【SpringBoot集成Druid连接池】数据源可以创建多个数据库连接,这些连接会保存在数据库连接池中。3. 集成Druid连接池 Druid连接池是目前最好的数据库连接池,在功能、性能、扩展性方面,远超于DBCP、C3P0等。
当需要建立数据库连接时,只需要从连接池中取出一个空闲的连接,用完之后再放回去。
传统的JDBC访问技术,每次访问数据库都需要通过数据库驱动器Driver和数据库名称以及密码等等资源建立数据库连接,会增加系统资源和CPU的开销,而连接池可以很好地解决这个问题。
另外,我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试以及性能调整提供依据。
SpringBoot主要有两种方式集成Druid连接池。
(1) 使用Druid启动器
直接在pom.xml中引入druid-spring-boot-starter,然后在application.yaml中配置就行:
com.alibaba
druid-spring-boot-starter
1.1.22
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
写一个简单的测试用例,打印数据源的配置:
@SpringBootTest
@RunWith(SpringRunner.class)
public class DruidStarterConfigTest {@Resource
private DataSource dataSource;
@Test
public void test() throws SQLException {
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println(druidDataSource.getDriverClassName());
System.out.println(druidDataSource.getUrl());
System.out.println(druidDataSource.getUsername());
System.out.println(druidDataSource.getPassword());
}
}
运行结果:
文章图片
(2) 自定义Druid连接池
在pom.xml中引入数据源,然后在application.yaml中进行配置:
com.alibaba
druid
1.2.5
没有druid启动器,就需要我们自己手动注入一个Druid数据源,这里使用了@ConfigurationProperties注入application.yaml中配置的属性。
@Configuration
public class DruidStarterConfig {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
还是使用上边的测试用例看看结果:
@SpringBootTest
@RunWith(SpringRunner.class)
public class DruidStarterConfigTest {@Resource
private DataSource dataSource;
@Test
public void test() throws SQLException {
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println(druidDataSource.getDriverClassName());
System.out.println(druidDataSource.getUrl());
System.out.println(druidDataSource.getUsername());
System.out.println(druidDataSource.getPassword());
}
}
文章图片
4. Druid连接池属性 除了上边配置的属性之外,Druid还提供了很多连接池属性,可以更好地对连接池进行管理和监控:
https://github.com/alibaba/dr...
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
#druid连接池配置
druid:
#初始化时建立物理连接的个数
initial-size: 5
#最小连接池数量
min-idle: 5
#最大连接池数量 maxIdle已经不再使用
max-active: 20
#获取连接时最大等待时间,单位毫秒
max-wait: 60000
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
#既作为检测的间隔时间又作为testWhileIdel执行的依据
time-between-eviction-runs-millis: 60000
#销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
min-evictable-idle-time-millis: 30000
#用来检测连接是否有效的sql 必须是一个查询语句
#mysql中为 select 'x'
#oracle中为 select 1 from dual
validation-query: select 'x'
#申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-borrow: false
#归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-return: false
#当数据库抛出不可恢复的异常时,抛弃该连接
exception-sorter: true
#是否缓存preparedStatement,mysql5.5+建议开启
pool-prepared-statements: true
#当值大于0时poolPreparedStatements会自动修改为true
max-pool-prepared-statement-per-connection-size: 20
篇幅所限,关于Druid中的其他功能本文就先不涉及了,后续有机会再进行介绍。
参考鸣谢 数据源:https://blog.csdn.net/dragon9...
数据源与连接池:https://www.cnblogs.com/chens...
Druid数据源的使用:https://juejin.cn/post/699320...
Druid启动器的使用:https://juejin.cn/post/699355...
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- springboot整合数据库连接池-->druid
- SpringBoot中YAML语法及几个注意点说明
- springboot结合redis实现搜索栏热搜功能及文字过滤
- springboot中.yml文件的值无法读取的问题及解决