springboot 项目mysql 连接过多问题排查与解决

背景

我们自己平台的产品发现指定的mysql数据库后台发现连接非常多,过多的连接对于数据库是一种负担。这些连接完成SQL执行任务后空闲着啥事也不干,白白占用内存资源,如果这些连接堆积起来,将导致MySQL超过最大连接数,从而无法新建MySQL连接,有可能导致“Too many connections”的错误。

解决

1、

一反馈连接多,我第一件事是查看mysql现在到底有多少连接。

SELECT count(*) FROM information_schema.PROCESSLIST WHERE DB = ‘bcloud_dev001’

去查看到底bcloud_dev001这个数据库占用了多少连接。 一看竟然有1030个连接。

然后我第一猜想会不会有连接泄露的情况呢? 然后我参考了这篇文章了解了下 information_schema.PROCESSLIST 这个表的参数 https://zhuanlan.zhihu.com/p/30743094(具体细节不讲)
然后我按照表中的TIME 字段进行排序

SELECT * FROM information_schema.PROCESSLIST WHERE DB = ‘bcloud_test001’ ORDER BY TIME desc limit 50

如图所示,发现应该不是存在泄露以及别的情况,因为数据TIME大值的很少,而且都是在sleep状态 (sleep状态就是等待客户端向它发送执行语句的状态)。(如果泄露的话,连接没有关闭,那么连接 会一直存在下去。而且会出现大量的长期存在的联接。当然了 这个要结合这连接池的配置一起看,初始化连接与当前连接个数比较)

2、

然后我转手去找springboot中关于连接池的配置。springboot默认的连接池是hikari连接池,这一块不细讲,会另开一篇文章讲解。
找到配置以后发现还是竟然最小的连接数的值没有设置,最大的设置到了1024。那么问题其实就解决了,
官网中对于最小值的配置解释为

🔢minimumIdle
This property controls the minimum number of idle connections that HikariCP tries to maintain in the pool. If the idle connections dip below this value and total connections in the pool are less than maximumPoolSize, HikariCP will make a best effort to add additional connections quickly and efficiently. However, for maximum performance and responsiveness to spike demands, we recommend not setting this value and instead allowing HikariCP to act as a fixed size connection pool. Default: same as maximumPoolSize

它的默认值为 maximumPoolSize 一样,所以相当于初始化的时候就相当于启动了一个最大值的参数的连接池。

后续自己更改了配置

#指定连接池初始化连接数
spring.datasource.minimum-idle=20
#指定连接池最大的连接数,包括使用中的和空闲的连接
spring.datasource.maximum-pool-size=500

别的配置我也都反复看了,我觉得默认值就好。官网建议这里设置一个固定的连接池最好。但是这里我将最大值设置成了500,其实只是不想背锅。项目比较大,啥人写的代码都有,万一泄露了都是个问题。

多说下 wait-timeout

mysql的wait-timeout 这个配置针对jdbc连接mysql的情况。如果在mysql中有大量的sleep的连接,那么设置这个参数就显得很有必要。它的作用是在设定的时间内关闭sleep的连接。默认值28800(8个小时)
查看wait-timeout的值

show global variables like ‘wait_timeout’;

修改wait-timeout的值(将wait_timeout的值修改为30s)

set GLOBAL wait_timeout=30

这样相当于是设置了全局变量,但是如果重启mysql服务的话,这个值又会被初始化。如果想永久的变动此值的话,要在my.cnf的修改此值的大小。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot项目连接MySQL的步骤如下: 1. 在pom.xml中添加MySQL驱动的依赖 2. 在application.properties文件中配置MySQL数据源的连接信息,例如: spring.datasource.url=jdbc:mysql://localhost:3306/数据库名称 spring.datasource.username=数据库用户名 spring.datasource.password=数据库密码 3. 在Spring Boot项目中使用JPA操作MySQL,例如创建实体类和仓储接口,使用@Repository、@Entity等注解。 ### 回答2: Spring Boot 是一个基于Spring的开源框架,它可以降低Spring的复杂性,使开发者能够快速开发应用程序。同时,MySQL是一种流行的关系型数据库,常用于存储应用程序的数据。在Spring Boot中连接MySQL数据库是一个很常见的需求,本文将介绍如何在Spring Boot项目连接MySQL数据库。 第一步是在pom.xml文件中添加MySQL依赖。在Spring Boot中连接MySQL可以使用MySQL Connector/J,这是Java的一个MySQL驱动。可以在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 这里使用的版本是8.0.25,可以根据自己的需要进行修改。 接下来,在application.properties文件中添加MySQL配置。可以使用以下配置: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 这里配置了MySQL的url、用户名、密码和驱动名。可以根据自己的情况修改。 最后,要在Spring Boot中配置JdbcTemplate。JdbcTemplate是Spring框架提供的一个用于简化JDBC操作的工具,它可以使得开发者不必编写繁琐的JDBC代码。在Spring Boot中,可以使用以下代码进行JdbcTemplate的配置: ``` @Configuration public class DataConfig { @Autowired private DataSource dataSource; @Bean public JdbcTemplate jdbcTemplate() { JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } } ``` 这里创建了一个DataConfig的类,并使用了@Autowired注解注入了DataSource。在@Bean注解的方法中创建了一个JdbcTemplate,并将dataSource设置到JdbcTemplate中。 现在,Spring Boot项目就可以连接MySQL数据库了。可以在代码中使用JdbcTemplate进行数据库操作,例如: ```java @Autowired private JdbcTemplate jdbcTemplate; public void getUser() { String sql = "SELECT * FROM user"; List<User> userList = jdbcTemplate.query(sql, new RowMapper<User>() { @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { User user = new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); return user; } }); } ``` 这个例子中使用了JdbcTemplate查询了一个用户列表。可以根据自己的需要进行更改。 综上所述,使用Spring Boot连接MySQL数据库可以分为三个步骤:添加MySQL依赖、配置MySQL连接信息以及配置JdbcTemplate。使用JdbcTemplate可以使得连接MySQL数据库更加简单方便。 ### 回答3: Spring Boot是一种基于Spring框架的快速开发框架。在Spring Boot中,使用JDBC来连接MySQL数据库是非常常见的操作。本文将介绍如何在Spring Boot项目连接MySQL。 第一步 配置依赖 在Maven或Gradle项目中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 其中,spring-boot-starter-data-jdbc是Spring Boot提供的JDBC访问数据库的起步依赖。mysql-connector-java是连接MySQL数据库的依赖。在Gradle项目中,需要在dependencies中加入如下代码: ```groovy implementation 'org.springframework.boot:spring-boot-starter-data-jdbc:2.5.3' implementation 'mysql:mysql-connector-java:8.0.25' ``` 第二步 配置数据源 在Spring Boot项目中,使用application.properties或application.yml配置文件配置数据库连接信息。以application.properties为例,配置如下: ``` spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 ``` 其中,driver-class-name是MySQL JDBC驱动类,url是连接MySQL数据库的地址,username和password是连接MySQL数据库的用户名和密码。 第三步 创建实体类 在Java中,需要定义实体类来映射数据库表。例如,定义一张学生表,表结构如下: ``` CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ``` 需要定义一个Student实体类,属性包括id、name和age。 ```java public class Student { private Long id; private String name; private Integer age; // getter and setter } ``` 第四步 创建DAO层 在Java中,需要定义DAO(Data Access Object)层来操作数据库。使用JDBC模板(JdbcTemplate)可以很方便地操作数据库。例如,定义一个StudentDao接口。 ```java public interface StudentDao { List<Student> list(); int save(Student student); int update(Student student); int delete(Long id); } ``` 然后,定义一个StudentDaoImpl类来实现StudentDao接口,使用JdbcTemplate操作数据库。 ```java @Repository public class StudentDaoImpl implements StudentDao { @Autowired JdbcTemplate jdbcTemplate; @Override public List<Student> list() { String sql = "SELECT * FROM student"; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class)); } @Override public int save(Student student) { String sql = "INSERT INTO student(name, age) VALUES(?, ?)"; return jdbcTemplate.update(sql, student.getName(), student.getAge()); } @Override public int update(Student student) { String sql = "UPDATE student SET name=?, age=? WHERE id=?"; return jdbcTemplate.update(sql, student.getName(), student.getAge(), student.getId()); } @Override public int delete(Long id) { String sql = "DELETE FROM student WHERE id=?"; return jdbcTemplate.update(sql, id); } } ``` 第五步 创建Service层 在Java中,需要定义Service层来实现业务逻辑。例如,定义一个StudentService接口。 ```java public interface StudentService { List<Student> list(); int save(Student student); int update(Student student); int delete(Long id); } ``` 然后,定义一个StudentServiceImpl类来实现StudentService接口,调用StudentDao接口中的方法操作数据库。 ```java @Service public class StudentServiceImpl implements StudentService { @Autowired StudentDao studentDao; @Override public List<Student> list() { return studentDao.list(); } @Override public int save(Student student) { return studentDao.save(student); } @Override public int update(Student student) { return studentDao.update(student); } @Override public int delete(Long id) { return studentDao.delete(id); } } ``` 第六步 编写Controller层 在Java中,需要定义Controller层来接收HTTP请求,调用Service层返回数据。例如,定义一个StudentController类。 ```java @RestController @RequestMapping("/student") public class StudentController { @Autowired StudentService studentService; @GetMapping("/") public List<Student> list() { return studentService.list(); } @PostMapping("/") public int save(@RequestBody Student student) { return studentService.save(student); } @PutMapping("/") public int update(@RequestBody Student student) { return studentService.update(student); } @DeleteMapping("/{id}") public int delete(@PathVariable("id") Long id) { return studentService.delete(id); } } ``` 以上就是使用Spring Boot连接MySQL数据库的完整流程。通过以上步骤,就可以在Spring Boot项目连接MySQL数据库,并实现数据的增删改查功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值