共计 3727 个字符,预计需要花费 10 分钟才能阅读完成。
1. 数据源
数据源 (DataSource) 是由 SUN 公司定义的用于获取数据库连贯的 JDBC 标准接口
它位于 javax.sql 包中,用来代替 DriverManager 的形式来获取连贯
package javax.sql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
// 省略正文
public interface DataSource extends CommonDataSource, Wrapper {Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
应用数据源能够间接获取数据库的连贯对象,不须要再编写数据库的代码。
2. 数据库连接池
数据源能够创立多个数据库连贯,这些连贯会保留在数据库连接池中。
当须要建设数据库连贯时,只须要从连接池中取出一个闲暇的连贯,用完之后再放回去。传统的 JDBC 拜访技术,每次拜访数据库都须要通过数据库驱动器 Driver 和数据库名称以及明码等等资源建设数据库连贯,会减少系统资源和 CPU 的开销,而连接池能够很好地解决这个问题。
另外,咱们能够通过连接池的管理机制监督数据库的连贯的数量、应用状况,为零碎开发、测试以及性能调整提供根据。
3. 集成 Druid 连接池
Druid 连接池是目前最好的数据库连接池,在性能、性能、扩展性方面,远超于 DBCP、C3P0 等。
SpringBoot 次要有两种形式集成 Druid 连接池。
(1) 应用 Druid 启动器
间接在 pom.xml 中引入 druid-spring-boot-starter,而后在 application.yaml 中配置就行:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
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 中进行配置:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
没有 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…