Mysql在 Spring Boot 项目中的完整配置指南

1. 基础配置

1.1 Maven依赖

xml 复制代码
<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version> <!-- 根据实际版本调整 -->
        <scope>runtime</scope>
    </dependency>
    
    <!-- 连接池(HikariCP已包含在starter中) -->
    <!-- 或者使用其他连接池 -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
</dependencies>

1.2 application.yml 基础配置

yaml 复制代码
spring:
  datasource:
    # 基本配置
    url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
    
    # Hikari连接池配置
    hikari:
      connection-timeout: 30000
      maximum-pool-size: 20
      minimum-idle: 10
      idle-timeout: 600000
      max-lifetime: 1800000
      connection-test-query: SELECT 1
      pool-name: HikariPool-YourApp
  
  # JPA配置
  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        jdbc:
          batch_size: 20
        order_inserts: true
        order_updates: true

1.3 application.properties 版本

dart 复制代码
# 基本配置
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Hikari连接池配置
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-test-query=SELECT 1

# JPA配置
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.jdbc.batch_size=20

2. 高级配置

2.1 多数据源配置

java 复制代码
@Configuration
public class DataSourceConfig {
    
    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Primary
    @Bean(name = "primaryEntityManager")
    public LocalContainerEntityManagerFactoryBean primaryEntityManager(
            EntityManagerFactoryBuilder builder,
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.primary.entity")
                .persistenceUnit("primary")
                .build();
    }
    
    @Bean(name = "secondaryEntityManager")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManager(
            EntityManagerFactoryBuilder builder,
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.secondary.entity")
                .persistenceUnit("secondary")
                .build();
    }
}

YAML配置:

yaml 复制代码
spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/primary_db
      username: root
      password: password1
      driver-class-name: com.mysql.cj.jdbc.Driver
      hikari:
        maximum-pool-size: 15
    
    secondary:
      url: jdbc:mysql://localhost:3306/secondary_db
      username: root
      password: password2
      driver-class-name: com.mysql.cj.jdbc.Driver
      hikari:
        maximum-pool-size: 10

2.2 读写分离配置

java 复制代码
@Configuration
@EnableTransactionManagement
public class ReadWriteDataSourceConfig {
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.write")
    public DataSource writeDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.read")
    public DataSource readDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public DataSource routingDataSource(
            @Qualifier("writeDataSource") DataSource writeDataSource,
            @Qualifier("readDataSource") DataSource readDataSource) {
        
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.WRITE, writeDataSource);
        targetDataSources.put(DataSourceType.READ, readDataSource);
        
        RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setDefaultTargetDataSource(writeDataSource);
        routingDataSource.setTargetDataSources(targetDataSources);
        
        return routingDataSource;
    }
}

2.3 连接池优化配置

yaml 复制代码
spring:
  datasource:
    hikari:
      # 连接池大小配置
      maximum-pool-size: 50
      minimum-idle: 10
      
      # 连接生命周期
      max-lifetime: 1800000  # 30分钟
      idle-timeout: 600000   # 10分钟
      connection-timeout: 30000  # 30秒
      
      # 连接验证
      connection-test-query: SELECT 1
      validation-timeout: 5000
      
      # 性能优化
      leak-detection-threshold: 60000  # 60秒
      initialization-fail-timeout: 1
      
      # 连接属性
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
        useLocalSessionState: true
        rewriteBatchedStatements: true
        cacheResultSetMetadata: true
        cacheServerConfiguration: true
        elideSetAutoCommits: true
        maintainTimeStats: false

3. JPA/Hibernate 高级配置

3.1 实体类配置

java 复制代码
@Entity
@Table(name = "users")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "username", nullable = false, unique = true, length = 50)
    private String username;
    
    @Column(name = "email", nullable = false, unique = true)
    private String email;
    
    @Column(name = "age")
    private Integer age;
    
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private UserStatus status;
    
    @Column(name = "created_at")
    @CreatedDate
    private LocalDateTime createdAt;
    
    @Column(name = "updated_at")
    @LastModifiedDate
    private LocalDateTime updatedAt;
    
    @Version
    @Column(name = "version")
    private Integer version;
    
    @Column(name = "metadata", columnDefinition = "json")
    @Convert(converter = JsonConverter.class)
    private Map<String, Object> metadata;
}

// JSON转换器
@Converter
public class JsonConverter implements AttributeConverter<Map<String, Object>, String> {
    
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    @Override
    public String convertToDatabaseColumn(Map<String, Object> attribute) {
        try {
            return objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
    
    @Override
    public Map<String, Object> convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, Map.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

3.2 Repository配置

java 复制代码
@Repository
public interface UserRepository extends JpaRepository<User, Long>,
                                        JpaSpecificationExecutor<User>,
                                        QuerydslPredicateExecutor<User> {
    
    // 方法名查询
    Optional<User> findByUsername(String username);
    
    List<User> findByAgeGreaterThan(int age);
    
    // @Query注解查询
    @Query("SELECT u FROM User u WHERE u.email LIKE %:email%")
    List<User> findByEmailContaining(@Param("email") String email);
    
    @Query(value = "SELECT * FROM users WHERE age > :age", nativeQuery = true)
    List<User> findUsersByAgeNative(@Param("age") int age);
    
    // 修改查询
    @Modifying
    @Query("UPDATE User u SET u.status = :status WHERE u.id = :id")
    @Transactional
    int updateUserStatus(@Param("id") Long id, @Param("status") UserStatus status);
}

3.3 审计配置

java 复制代码
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
    
    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getName)
                .or(() -> Optional.of("system"));
    }
}

4. 事务管理配置

4.1 声明式事务

java 复制代码
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
    
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

// 服务层使用
@Service
@Transactional
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional(readOnly = true)
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public User createUser(User user) {
        return userRepository.save(user);
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateUserStatus(Long id, UserStatus status) {
        userRepository.updateUserStatus(id, status);
    }
}

4.2 编程式事务

java 复制代码
@Service
public class UserService {
    
    @Autowired
    private PlatformTransactionManager transactionManager;
    
    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void complexOperation() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // 业务操作
                    // ...
                } catch (Exception e) {
                    status.setRollbackOnly();
                    throw e;
                }
            }
        });
    }
    
    public void manualTransaction() {
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        definition.setTimeout(30);
        
        TransactionStatus status = transactionManager.getTransaction(definition);
        
        try {
            // 业务操作
            // ...
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
    }
}

5. 性能优化配置

5.1 批量操作

yaml 复制代码
spring:
  jpa:
    properties:
      hibernate:
        # 批量插入/更新
        jdbc.batch_size: 50
        order_inserts: true
        order_updates: true
        
        # 二级缓存配置
        cache.use_second_level_cache: true
        cache.use_query_cache: true
        cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
        generate_statistics: true

5.2 连接池监控

java 复制代码
@Configuration
public class HikariMetricsConfig {
    
    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return registry -> registry.config().commonTags("application", "your-app-name");
    }
}

// 在application.yml中启用监控
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  metrics:
    enable:
      hikaricp: true

6. 安全配置

6.1 加密密码配置

java 复制代码
@Configuration
public class DataSourceSecurityConfig {
    
    @Value("${datasource.password}")
    private String encryptedPassword;
    
    @Bean
    public DataSource dataSource() {
        // 解密密码
        String decryptedPassword = decryptPassword(encryptedPassword);
        
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/your_database");
        dataSource.setUsername("root");
        dataSource.setPassword(decryptedPassword);
        // ... 其他配置
        
        return dataSource;
    }
    
    private String decryptPassword(String encrypted) {
        // 实现解密逻辑
        return encrypted; // 实际应用中需要解密
    }
}

6.2 SSL连接配置

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useSSL=true&requireSSL=true&verifyServerCertificate=true&serverTimezone=Asia/Shanghai
    hikari:
      data-source-properties:
        sslMode: REQUIRED
        trustCertificateKeyStoreUrl: file:/path/to/keystore.jks
        trustCertificateKeyStorePassword: keystore_password

7. 故障排除配置

7.1 日志配置

yaml 复制代码
logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    org.springframework.orm.jpa: DEBUG
    org.springframework.transaction: DEBUG
    com.zaxxer.hikari: DEBUG

7.2 健康检查

yaml 复制代码
management:
  health:
    db:
      enabled: true
    diskspace:
      enabled: true
  endpoint:
    health:
      show-details: always

8. 完整配置示例

yaml 复制代码
# application-prod.yml 生产环境配置
spring:
  datasource:
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:production_db}?useUnicode=true&characterEncoding=utf8&useSSL=true&requireSSL=true&verifyServerCertificate=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: ${DB_USERNAME:app_user}
    password: ${DB_PASSWORD:strong_password}
    driver-class-name: com.mysql.cj.jdbc.Driver
    
    hikari:
      maximum-pool-size: ${DB_POOL_SIZE:50}
      minimum-idle: 10
      max-lifetime: 1800000
      idle-timeout: 600000
      connection-timeout: 30000
      connection-test-query: SELECT 1
      leak-detection-threshold: 120000
      validation-timeout: 5000
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
        rewriteBatchedStatements: true
  
  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    show-sql: false
    hibernate:
      ddl-auto: validate
    properties:
      hibernate:
        jdbc:
          batch_size: 30
        order_inserts: true
        order_updates: true
        generate_statistics: false
        cache:
          use_second_level_cache: true
          region:
            factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
        query:
          in_clause_parameter_padding: true
  
  sql:
    init:
      mode: never

# 监控配置
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  metrics:
    enable:
      hikaricp: true
  health:
    db:
      enabled: true

# 日志配置
logging:
  level:
    com.yourcompany: INFO
    org.springframework: WARN
    org.hibernate: ERROR

9. 常用配置说明

9.1 重要参数说明

  • useSSL: 是否使用SSL加密连接
  • serverTimezone: 服务器时区设置
  • allowPublicKeyRetrieval: 允许公钥检索
  • characterEncoding: 字符编码
  • rewriteBatchedStatements: 批量语句重写(性能优化)
  • useServerPrepStmts: 使用服务器端预处理语句

9.2 DDL-Auto 选项

  • none: 不做任何操作
  • validate: 验证表结构,不修改
  • update: 更新表结构
  • create: 每次启动创建新表(会删除旧数据)
  • create-drop: 启动创建,关闭删除

9.3 连接池选择

  • HikariCP (默认): 高性能,推荐使用
  • Tomcat JDBC: 替代选择
  • DBCP2: Apache Commons项目
  • C3P0: 老牌连接池(基本不怎么用)
  • Druid: 阿里出品,必属精品(必须推荐)
相关推荐
吴可可1231 天前
用Teigha修改并保存CAD文件
数据库·算法·c#
zb200641201 天前
Laravel7.x十大核心特性解析
spring boot·后端·laravel
yuzhiboyouye1 天前
内连接,左连接,右连接怎么区别开来?
数据库
他们叫我阿冠1 天前
Day5学习--SpringBoot详解
spring boot·后端·学习
铭毅天下1 天前
Easysearch 版本进化全图——从 ES 国产替代到 AI Native 搜索数据库
大数据·数据库·人工智能·elasticsearch·搜索引擎
muddjsv1 天前
SQL 最常用技能详解与实战示例
数据库·sql·mysql
muddjsv1 天前
大中小型企业数据配置年度成本估算分析
数据库·企业运营
ᰔᩚ. 一怀明月ꦿ1 天前
MySQL 学习目标
学习·mysql·adb
塔能物联运维1 天前
存量机房升级成为行业主流方向:热管理重构算力中心价值路径
数据库
vx-程序开发1 天前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php