aws-rds-spring-boot-integration

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

AWS RDS Spring Boot Integration

AWS RDS与Spring Boot集成

Configure AWS RDS databases (Aurora, MySQL, PostgreSQL) with Spring Boot applications for production-ready connectivity.
为Spring Boot应用配置AWS RDS数据库(Aurora、MySQL、PostgreSQL),实现生产就绪的数据库连接。

When to Use This Skill

何时使用该技能

Use this skill when:
  • Setting up AWS RDS Aurora with Spring Data JPA
  • Configuring datasource properties for Aurora, MySQL, or PostgreSQL endpoints
  • Implementing HikariCP connection pooling for RDS
  • Setting up environment-specific configurations (dev/prod)
  • Configuring SSL connections to AWS RDS
  • Troubleshooting RDS connection issues
  • Setting up database migrations with Flyway
  • Integrating with AWS Secrets Manager for credential management
  • Optimizing connection pool settings for RDS workloads
  • Implementing read/write split with Aurora
在以下场景中使用本技能:
  • 搭配Spring Data JPA搭建AWS RDS Aurora
  • 为Aurora、MySQL或PostgreSQL端点配置数据源属性
  • 为RDS实现HikariCP连接池
  • 配置环境专属的配置(开发/生产)
  • 配置与AWS RDS的SSL连接
  • 排查RDS连接问题
  • 使用Flyway配置数据库迁移
  • 集成AWS Secrets Manager进行凭证管理
  • 针对RDS工作负载优化连接池设置
  • 为Aurora实现读写分离

Prerequisites

前置条件

Before starting AWS RDS Spring Boot integration:
  1. AWS account with RDS access
  2. Spring Boot project (3.x)
  3. RDS instance created and running (Aurora/MySQL/PostgreSQL)
  4. Security group configured for database access
  5. Database endpoint information available
  6. Database credentials secured (environment variables or Secrets Manager)
开始AWS RDS与Spring Boot集成前需满足:
  1. 拥有具备RDS访问权限的AWS账号
  2. Spring Boot项目(3.x版本)
  3. 已创建并运行的RDS实例(Aurora/MySQL/PostgreSQL)
  4. 已配置好数据库访问的安全组
  5. 可获取数据库端点信息
  6. 已妥善保管数据库凭证(环境变量或Secrets Manager)

Quick Start

快速开始

Step 1: Add Dependencies

步骤1:添加依赖

Maven (pom.xml):
xml
<dependencies>
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- Aurora MySQL Driver -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.2.0</version>
        <scope>runtime</scope>
    </dependency>

    <!-- Aurora PostgreSQL Driver (alternative) -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Flyway for database migrations -->
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>

    <!-- Validation -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>
Gradle (build.gradle):
gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    // Aurora MySQL
    runtimeOnly 'com.mysql:mysql-connector-j:8.2.0'

    // Aurora PostgreSQL (alternative)
    runtimeOnly 'org.postgresql:postgresql'

    // Flyway
    implementation 'org.flywaydb:flyway-core'
}
Maven (pom.xml):
xml
<dependencies>
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- Aurora MySQL Driver -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.2.0</version>
        <scope>runtime</scope>
    </dependency>

    <!-- Aurora PostgreSQL Driver (alternative) -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Flyway for database migrations -->
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>

    <!-- Validation -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>
Gradle (build.gradle):
gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    // Aurora MySQL
    runtimeOnly 'com.mysql:mysql-connector-j:8.2.0'

    // Aurora PostgreSQL (alternative)
    runtimeOnly 'org.postgresql:postgresql'

    // Flyway
    implementation 'org.flywaydb:flyway-core'
}

Step 2: Basic Datasource Configuration

步骤2:基础数据源配置

application.properties (Aurora MySQL):
properties
undefined
application.properties(Aurora MySQL):
properties
undefined

Aurora MySQL Datasource - Cluster Endpoint

Aurora MySQL Datasource - Cluster Endpoint

spring.datasource.url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.username=admin spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.username=admin spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

JPA/Hibernate Configuration

JPA/Hibernate Configuration

spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.format_sql=true spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.format_sql=true spring.jpa.open-in-view=false

HikariCP Connection Pool

HikariCP Connection Pool

spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1200000

Flyway Configuration

Flyway Configuration

spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true spring.flyway.locations=classpath:db/migration

**application.properties (Aurora PostgreSQL):**
```properties
spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true spring.flyway.locations=classpath:db/migration

**application.properties(Aurora PostgreSQL):**
```properties

Aurora PostgreSQL Datasource

Aurora PostgreSQL Datasource

spring.datasource.url=jdbc:postgresql://myapp-aurora-pg-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:5432/devops spring.datasource.username=admin spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://myapp-aurora-pg-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:5432/devops spring.datasource.username=admin spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver

JPA/Hibernate Configuration

JPA/Hibernate Configuration

spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.jpa.open-in-view=false
undefined
spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.jpa.open-in-view=false
undefined

Step 3: Set Up Environment Variables

步骤3:设置环境变量

bash
undefined
bash
undefined

Production environment variables

Production environment variables

export DB_PASSWORD=YourStrongPassword123! export SPRING_PROFILES_ACTIVE=prod
export DB_PASSWORD=YourStrongPassword123! export SPRING_PROFILES_ACTIVE=prod

For development

For development

export SPRING_PROFILES_ACTIVE=dev
undefined
export SPRING_PROFILES_ACTIVE=dev
undefined

Configuration Examples

配置示例

Simple Aurora Cluster (MySQL)

简单Aurora集群(MySQL)

application.yml:
yaml
spring:
  application:
    name: DevOps

  datasource:
    url: jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops
    username: admin
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver

    hikari:
      pool-name: AuroraHikariPool
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 20000
      idle-timeout: 300000
      max-lifetime: 1200000
      leak-detection-threshold: 60000
      connection-test-query: SELECT 1

  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: false
    open-in-view: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: true
        jdbc:
          batch_size: 20
        order_inserts: true
        order_updates: true

  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: classpath:db/migration
    validate-on-migrate: true

logging:
  level:
    org.hibernate.SQL: WARN
    com.zaxxer.hikari: INFO
application.yml:
yaml
spring:
  application:
    name: DevOps

  datasource:
    url: jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops
    username: admin
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver

    hikari:
      pool-name: AuroraHikariPool
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 20000
      idle-timeout: 300000
      max-lifetime: 1200000
      leak-detection-threshold: 60000
      connection-test-query: SELECT 1

  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: false
    open-in-view: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: true
        jdbc:
          batch_size: 20
        order_inserts: true
        order_updates: true

  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: classpath:db/migration
    validate-on-migrate: true

logging:
  level:
    org.hibernate.SQL: WARN
    com.zaxxer.hikari: INFO

Read/Write Split Configuration

读写分离配置

For read-heavy workloads, use separate writer and reader datasources:
application.properties:
properties
undefined
针对读密集型工作负载,使用独立的写入和读取数据源:
application.properties:
properties
undefined

Aurora MySQL - Writer Endpoint

Aurora MySQL - Writer Endpoint

spring.datasource.writer.jdbc-url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.writer.username=admin spring.datasource.writer.password=${DB_PASSWORD} spring.datasource.writer.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.writer.jdbc-url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.writer.username=admin spring.datasource.writer.password=${DB_PASSWORD} spring.datasource.writer.driver-class-name=com.mysql.cj.jdbc.Driver

Aurora MySQL - Reader Endpoint (Read Replicas)

Aurora MySQL - Reader Endpoint (Read Replicas)

spring.datasource.reader.jdbc-url=jdbc:mysql://myapp-aurora-cluster.cluster-ro-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.reader.username=admin spring.datasource.reader.password=${DB_PASSWORD} spring.datasource.reader.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.reader.jdbc-url=jdbc:mysql://myapp-aurora-cluster.cluster-ro-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops spring.datasource.reader.username=admin spring.datasource.reader.password=${DB_PASSWORD} spring.datasource.reader.driver-class-name=com.mysql.cj.jdbc.Driver

HikariCP for Writer

HikariCP for Writer

spring.datasource.writer.hikari.maximum-pool-size=15 spring.datasource.writer.hikari.minimum-idle=5
spring.datasource.writer.hikari.maximum-pool-size=15 spring.datasource.writer.hikari.minimum-idle=5

HikariCP for Reader

HikariCP for Reader

spring.datasource.reader.hikari.maximum-pool-size=25 spring.datasource.reader.hikari.minimum-idle=10
undefined
spring.datasource.reader.hikari.maximum-pool-size=25 spring.datasource.reader.hikari.minimum-idle=10
undefined

SSL Configuration

SSL配置

Aurora MySQL with SSL:
properties
spring.datasource.url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops?useSSL=true&requireSSL=true&verifyServerCertificate=true
Aurora PostgreSQL with SSL:
properties
spring.datasource.url=jdbc:postgresql://myapp-aurora-pg-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:5432/devops?ssl=true&sslmode=require
Aurora MySQL搭配SSL:
properties
spring.datasource.url=jdbc:mysql://myapp-aurora-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:3306/devops?useSSL=true&requireSSL=true&verifyServerCertificate=true
Aurora PostgreSQL搭配SSL:
properties
spring.datasource.url=jdbc:postgresql://myapp-aurora-pg-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:5432/devops?ssl=true&sslmode=require

Environment-Specific Configuration

环境专属配置

Development Profile

开发环境配置文件

application-dev.properties:
properties
undefined
application-dev.properties:
properties
undefined

Local MySQL for development

Local MySQL for development

spring.datasource.url=jdbc:mysql://localhost:3306/devops_dev spring.datasource.username=root spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/devops_dev spring.datasource.username=root spring.datasource.password=root

Enable DDL auto-update in development

Enable DDL auto-update in development

spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true

Smaller connection pool for local dev

Smaller connection pool for local dev

spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.minimum-idle=2
undefined
spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.minimum-idle=2
undefined

Production Profile

生产环境配置文件

application-prod.properties:
properties
undefined
application-prod.properties:
properties
undefined

Aurora Cluster Endpoint (Production)

Aurora Cluster Endpoint (Production)

spring.datasource.url=jdbc:mysql://${AURORA_ENDPOINT}:3306/${DB_NAME} spring.datasource.username=${DB_USERNAME} spring.datasource.password=${DB_PASSWORD}
spring.datasource.url=jdbc:mysql://${AURORA_ENDPOINT}:3306/${DB_NAME} spring.datasource.username=${DB_USERNAME} spring.datasource.password=${DB_PASSWORD}

Validate schema only in production

Validate schema only in production

spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.open-in-view=false

Production-optimized connection pool

Production-optimized connection pool

spring.datasource.hikari.maximum-pool-size=30 spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.maximum-pool-size=30 spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1200000

Enable Flyway migrations

Enable Flyway migrations

spring.flyway.enabled=true spring.flyway.validate-on-migrate=true
undefined
spring.flyway.enabled=true spring.flyway.validate-on-migrate=true
undefined

Database Migration Setup

数据库迁移设置

Create migration files for Flyway:
src/main/resources/db/migration/
├── V1__create_users_table.sql
├── V2__add_phone_column.sql
└── V3__create_orders_table.sql
V1__create_users_table.sql:
sql
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
为Flyway创建迁移文件:
src/main/resources/db/migration/
├── V1__create_users_table.sql
├── V2__add_phone_column.sql
└── V3__create_orders_table.sql
V1__create_users_table.sql:
sql
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Advanced Features

高级功能

For advanced configuration, see the reference documents:
  • Multi-datasource, SSL, Secrets Manager integration
  • Common issues and solutions
如需高级配置,请参考参考文档:
  • 多数据源、SSL、Secrets Manager集成
  • 常见问题与解决方案

Best Practices

最佳实践

Connection Pool Optimization

连接池优化

  • Use HikariCP with Aurora-optimized settings
  • Set appropriate pool sizes based on Aurora instance capacity
  • Configure connection timeouts for failover handling
  • Enable leak detection
  • 使用适配Aurora的HikariCP配置
  • 根据Aurora实例容量设置合适的池大小
  • 配置连接超时以处理故障转移
  • 启用连接泄漏检测

Security Best Practices

安全最佳实践

  • Never hardcode credentials in configuration files
  • Use environment variables or AWS Secrets Manager
  • Enable SSL/TLS connections
  • Configure proper security group rules
  • Use IAM Database Authentication when possible
  • 切勿在配置文件中硬编码凭证
  • 使用环境变量或AWS Secrets Manager
  • 启用SSL/TLS连接
  • 配置恰当的安全组规则
  • 尽可能使用IAM数据库认证

Performance Optimization

性能优化

  • Enable batch operations for bulk data operations
  • Disable open-in-view pattern to prevent lazy loading issues
  • Use appropriate indexing for Aurora queries
  • Configure connection pooling for high availability
  • 为批量数据操作启用批处理
  • 关闭open-in-view模式以避免懒加载问题
  • 为Aurora查询配置合适的索引
  • 为高可用性配置连接池

Monitoring

监控

  • Enable Spring Boot Actuator for database metrics
  • Monitor connection pool metrics
  • Set up proper logging for debugging
  • Configure health checks for database connectivity
  • 启用Spring Boot Actuator以获取数据库指标
  • 监控连接池指标
  • 配置恰当的日志用于调试
  • 配置数据库连接的健康检查

Testing

测试

Create a health check endpoint to test database connectivity:
java
@RestController
@RequestMapping("/api/health")
public class DatabaseHealthController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/db-connection")
    public ResponseEntity<Map<String, Object>> testDatabaseConnection() {
        Map<String, Object> response = new HashMap<>();

        try (Connection connection = dataSource.getConnection()) {
            response.put("status", "success");
            response.put("database", connection.getCatalog());
            response.put("url", connection.getMetaData().getURL());
            response.put("connected", true);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            response.put("status", "failed");
            response.put("error", e.getMessage());
            response.put("connected", false);
            return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);
        }
    }
}
Test with cURL:
bash
curl http://localhost:8080/api/health/db-connection
创建健康检查端点以测试数据库连接:
java
@RestController
@RequestMapping("/api/health")
public class DatabaseHealthController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/db-connection")
    public ResponseEntity<Map<String, Object>> testDatabaseConnection() {
        Map<String, Object> response = new HashMap<>();

        try (Connection connection = dataSource.getConnection()) {
            response.put("status", "success");
            response.put("database", connection.getCatalog());
            response.put("url", connection.getMetaData().getURL());
            response.put("connected", true);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            response.put("status", "failed");
            response.put("error", e.getMessage());
            response.put("connected", false);
            return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);
        }
    }
}
使用cURL测试:
bash
curl http://localhost:8080/api/health/db-connection

Support

支持

For detailed troubleshooting and advanced configuration, refer to:
如需详细故障排除和高级配置,请参考: