在Spring Boot中使用国产数据库连接池Druid
最佳答案 问答题库1048位专家为你答疑解惑
在我们实际开发过程中,我们经常使用的是DriverManager来获取,通过每次都向数据库建立连接时将Connection加载到内存中,然后验证用户名和密码,这段时间的消耗大致在0.0 5s - 1s
左右,每次当我们需要获取数据库连接的时候,就需要向数据库要求一次,执行之后在断开连接,这样的重复的操作,在一定程度上也会消耗部分时间以及资源,数据库的连接资源并未得到充分的利用,假设,当同时有几百人或者几千人在线,那么频繁的进行数据库连接操作,将会占用很多系统资源,眼中的甚至造成服务器崩溃。
为了避免这种传统开发过程中的数据库连接问题,开发者便尝试采用数据库连接池技术。其基本思想就是: 为数据库连接建立一个“缓冲池“。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时候,只需要从“缓冲池“中取出一个,然后再使用完毕后放回去。
在此文中,我们将使用由我们阿里巴巴数据库事业部出品的一个开源项目,他除了是一个高性能数据库连接池之外,更是一个自带监控的数据库连接池。我们在《Spring Boot中配置默认的HikariCP数据源》中围绕了Hikari进行了相关讲解,知道他虽然很优秀,但是对于国内的用户来说,我们可能对Druid更加熟悉,故而关于在Spring Boot中使用Druid是我们作为后端开发人员需要掌握的一项基本技能。
配置Druid数据源
仍旧是新建一个Spring Boot项目
第一步,引入相关依赖。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--引入Druid依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version></dependency>
<!--进行监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.oracle.ojdbc</groupId><artifactId>ojdbc8</artifactId><version>19.3.0.0</version></dependency></dependencies>
第二步,在Spring Boot的application.properties中配置数据库连接信息。
Druid的配置都是以spring.datasource.druid
作为前缀的
# MySQL基础配置
#spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
#spring.datasource.druid.username=root
#spring.datasource.druid.password=
#spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driverserver.port=8088# Oracle
spring.datasource.druid.url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=oracle.jdbc.driver.OracleDriver
# 连接池配置
spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1 from useradd
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat,wall# 监控配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
属性参照报表:
filter:stat
日志用的filter:log4j
防御sql注入的filter:wall
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系–––
配置开启stat监控统计的界面以及监控内容的相关配置:
spring.datasource.druid.stat-view-servlet.url-pattern
:访问地址规则
spring.datasource.druid.stat-view-servlet.reset-enable
:是否允许清空统计数据
spring.datasource.druid.stat-view-servlet.login-username
:监控页面的登录账户
spring.datasource.druid.stat-view-servlet.login-password
:监控页面的登录密码
第三步:创建相关实体类User
public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}public User(String name, Integer age) {this.name = name;this.age = age;}public User() {}
}
第四步:创建相关业务接口:
public interface UserService {/*** 新增一个用户** @param name* @param age*/int create(String name, Integer age);/*** 根据name查询用户** @param name* @return*/List<User> getByName(String name);/*** 根据name删除用户** @param name*/int deleteByName(String name);abstract int getAllUsers();/*** 删除所有用户*/int deleteAllUsers();}
第五步:实现接口
@Service
public class UserServiceImpl implements UserService {private JdbcTemplate jdbcTemplate;UserServiceImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic int create(String name, Integer age) {return jdbcTemplate.update("insert into USERADD(NAME, AGE) values(?, ?)", name, age);}@Overridepublic List<User> getByName(String name) {List<User> users = jdbcTemplate.query("select NAME, AGE from USERADD where NAME = ?", (resultSet, i) -> {User user = new User();user.setName(resultSet.getString("NAME"));user.setAge(resultSet.getInt("AGE"));return user;}, name);return users;}@Overridepublic int deleteByName(String name) {return jdbcTemplate.update("delete from USERADD where NAME = ?", name);}@Overridepublic int getAllUsers() {return jdbcTemplate.queryForObject("select count(1) from USERADD", Integer.class);}@Overridepublic int deleteAllUsers() {return jdbcTemplate.update("delete from USERADD");}}
第六步:创建相关控制层,调用业务层
@RestController
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/user")public int create(@RequestBody User user) {return userService.create(user.getName(), user.getAge());}@GetMapping("/user/{name}")public List<User> getByName(@PathVariable String name) {return userService.getByName(name);}@DeleteMapping("/user/{name}")public int deleteByName(@PathVariable String name) {return userService.deleteByName(name);}@GetMapping("/user/count")public int getAllUsers() {return userService.getAllUsers();}@DeleteMapping("/user/all")public int deleteAllUsers() {return userService.deleteAllUsers();}}
http://localhost:8088/druid/login.html
admin – admin
数据源:这里可以看到之前我们配置的数据库连接池信息以及当前使用情况的各种指标。
SQL监控:该数据源中执行的SQL语句极其统计数据。在这个页面上,我们可以很方便的看到当前这个Spring Boot都执行过哪些SQL,这些SQL的执行频率和执行效率也都可以清晰的看到。如果你这里没看到什么数据?别忘了我们之前创建了一个Controller,用这些接口可以触发UserService对数据库的操作。所以,这里我们可以通过调用接口的方式去触发一些操作,这样SQL监控页面就会产生一些数据:
图中监控项上,执行时间、读取行数、更新行数都通过区间分布的方式表示,将耗时分布成8个区间:
0 - 1 耗时0到1毫秒的次数
1 - 10 耗时1到10毫秒的次数
10 - 100 耗时10到100毫秒的次数
100 - 1,000 耗时100到1000毫秒的次数
1,000 - 10,000 耗时1到10秒的次数
10,000 - 100,000 耗时10到100秒的次数
100,000 - 1,000,000 耗时100到1000秒的次数
1,000,000 - 耗时1000秒以上的次数
SQL防火墙:该页面记录了与SQL监控不同维度的监控数据,更多用于对表访问维度、SQL防御维度的统计。
该功能数据记录的统计需要在spring.datasource.druid.filters
中增加wall属性才会进行记录统计,比如这样:
spring.datasource.druid.filters=stat,wall
注意:这里的所有监控信息是对这个应用实例的数据源而言的,而并不是数据库全局层面的,可以视为应用层的监控,不可能作为中间件层的监控。
编写测试类:
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter33ApplicationTests {@Autowiredprivate UserService userSerivce;@Autowiredprivate DataSource dataSource;@Beforepublic void setUp() {// 准备,清空user表userSerivce.deleteAllUsers();}@Testpublic void test() throws Exception {// 插入5个用户userSerivce.create("Tom", 10);userSerivce.create("Mike", 11);userSerivce.create("Didispace", 30);userSerivce.create("Oscar", 21);userSerivce.create("Linda", 17);// 查询名为Oscar的用户,判断年龄是否匹配List<User> userList = userSerivce.getByName("Oscar");Assert.assertEquals(21, userList.get(0).getAge().intValue());// 查数据库,应该有5个用户Assert.assertEquals(5, userSerivce.getAllUsers());// 删除两个用户userSerivce.deleteByName("Tom");userSerivce.deleteByName("Mike");// 查数据库,应该有5个用户Assert.assertEquals(3, userSerivce.getAllUsers());}}
99%的人还看了
相似问题
- MySQL数据库:开源且强大的关系型数据库管理系统
- 【腾讯云云上实验室-向量数据库】探索腾讯云向量数据库:全方位管理与高效利用多维向量数据的引领者
- 【史上最细教程】服务器MySQL数据库完成主从复制
- 字符串结尾空格比较相关参数BLANK_PAD_MODE(DM8:达梦数据库)
- 缓存雪崩、击穿、穿透及解决方案_保证缓存和数据库一致性
- Redis 与其他数据库的不同之处 | Navicat
- 多协议数据库管理软件 Navicat Premium 16 mac中文版功能
- (数据库管理系统)DBMS与(数据库系统)DBS的区别
- duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113
- 数据库课后习题加真题
猜你感兴趣
版权申明
本文"在Spring Boot中使用国产数据库连接池Druid":http://eshow365.cn/6-33106-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!