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: 阿里出品,必属精品(必须推荐)