数据库连接配置
在application.properties或application.yml中正确配置MySQL连接参数,包括URL、用户名、密码及驱动类。URL需指定时区(如serverTimezone=UTC),避免时区不一致导致的查询异常。
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver连接池优化
默认使用HikariCP连接池,需合理配置连接数参数。spring.datasource.hikari.maximum-pool-size建议根据并发量调整(通常为CPU核心数的2倍),避免连接泄漏或资源耗尽。
spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.idle-timeout=30000实体类与表映射
使用JPA时,@Entity注解的类需与表名匹配,@Column注解字段与列名一致。建议开启spring.jpa.hibernate.ddl-auto=validate模式,避免自动建表导致生产环境意外修改。
@Entity@Table(name="user")publicclassUser{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@Column(name="username")privateStringname;}事务管理
增删改操作需添加@Transactional注解确保原子性。Service层方法默认开启事务,避免在Controller层使用事务注解。只读查询可添加@Transactional(readOnly = true)提升性能。
@ServicepublicclassUserService{@TransactionalpublicvoidupdateUser(Useruser){userRepository.save(user);}}SQL性能监控
开发环境可开启spring.jpa.show-sql=true打印SQL日志。生产环境建议使用P6Spy或Log4j2格式化SQL输出,结合EXPLAIN分析慢查询。
spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG字符集与编码
确保数据库、表及字段使用UTF-8编码,防止中文乱码。建表时显式指定CHARACTER SET utf8mb4,JDBC URL可追加useUnicode=true&characterEncoding=UTF-8。
CREATETABLE`user`(`name`VARCHAR(45)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;批量操作处理
大数据量插入或更新时,使用JpaRepository.saveAll()配合batch_size参数提升性能。需在配置中启用批处理并优化缓冲区大小。
spring.jpa.properties.hibernate.jdbc.batch_size=50 spring.jpa.properties.hibernate.order_inserts=true索引优化
高频查询字段需通过@Table或@Index注解添加索引,避免全表扫描。复杂查询建议使用@Query自定义JPQL或原生SQL,并通过数据库工具验证索引命中率。
@Entity@Table(name="product",indexes={@Index(name="idx_category",columnList="category_id")})publicclassProduct{...}数据类型匹配
Java对象属性与MySQL字段类型需严格对应。LocalDateTime对应DATETIME,BigDecimal对应DECIMAL,避免精度丢失或类型转换异常。
连接保活配置
生产环境需配置连接测试查询和超时参数,防止因长时间空闲导致连接失效。定期验证连接有效性并设置合理的超时阈值。
spring.datasource.hikari.connection-test-query=SELECT 1 spring.datasource.hikari.connection-timeout=30000