You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 2.7 默认MySQL数据源配置及启动异常解决求助

正确配置Spring Boot 2.7默认MySQL数据源的解决方案

首先,先帮你解决那个“修改后无法恢复”的诡异问题——这大概率是IDE缓存或者Spring Boot DevTools的残留缓存导致的。你可以试试这几步:

  • 清理Maven构建缓存:执行mvn clean命令。
  • 重启IDE,选择"Invalidate Caches / Restart"选项,彻底清除IDE的缓存。
  • 删除项目目录下的target文件夹,重新构建项目。

接下来回到核心问题:Spring Boot 2.7默认已经集成了HikariCP作为数据源实现,所以你完全不需要手动添加HikariCP的依赖,spring-boot-starter-data-jpa已经包含了它。下面是最简且正确的配置方案

1. 正确的Maven依赖

只需要这两个依赖就够了,不需要额外的HikariCP依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!-- Spring Boot 2.7建议指定版本,或依赖Spring Boot的依赖管理自动适配 -->
    <version>8.0.33</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2. application.properties的正确配置

注意统一配置项格式,MySQL 8.x的驱动类是com.mysql.cj.jdbc.Driver,建议加上时区参数避免时区异常:

# JPA相关配置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update # 根据需求选择create/update/validate等
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

# 数据源核心配置
spring.datasource.url=jdbc:mysql://sweetsuse/pubshweb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=pubshweb
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# HikariCP可选自定义配置(不需要可省略)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=2
spring.datasource.hikari.connection-timeout=30000

3. 如何通过DataSource访问数据库

默认情况下,Spring Boot已经自动创建了DataSource Bean,你不需要手动定义。如果只是需要在代码中使用,直接依赖注入即可:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;

@Service
public class DatabaseTestService {
    private final DataSource dataSource;
    private final JdbcTemplate jdbcTemplate;

    // 构造函数注入(Spring Boot推荐方式)
    public DatabaseTestService(DataSource dataSource, JdbcTemplate jdbcTemplate) {
        this.dataSource = dataSource;
        this.jdbcTemplate = jdbcTemplate;
    }

    // 示例方法:验证数据源连接
    public void checkConnection() {
        try {
            String dbUrl = dataSource.getConnection().getMetaData().getURL();
            System.out.println("成功连接数据库:" + dbUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果确实需要自定义DataSource Bean(比如多数据源场景),正确写法是绑定配置文件属性,而非空的build()

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

这样Spring会自动把spring.datasource前缀的配置绑定到HikariDataSource实例上,无需手动设置参数。

4. 解决JMX实例冲突问题

你之前遇到的javax.management.InstanceAlreadyExistsException错误,是因为Spring Boot Admin的JMX实例重复存在,通常是重复启动应用或DevTools热重载导致的。可以通过以下方式解决:

  • 在application.properties中禁用Spring Boot Admin的JMX自动配置:
    spring.application.admin.enabled=false
    
  • 启动前彻底关闭之前的应用进程,避免端口和JMX实例冲突。

最后验证步骤

  1. 清理项目缓存,重新构建。
  2. 确认application.properties配置正确,尤其是数据库地址、用户名密码、时区参数。
  3. 启动应用,观察控制台日志,若无数据源相关错误则配置成功。
  4. 编写简单测试代码,注入DataSource或JdbcTemplate,验证数据库连接是否正常。

内容的提问来源于stack exchange,提问作者gecko

火山引擎 最新活动