
常见异常1:CommunicationsException(连接异常)
出现场景:数据库连接超时或网络中断。检查MySQL服务状态、网络配置、连接池参数(如wait_timeout)。解决方案:调整连接池的validationQuery和testOnBorrow参数,例如在Druid中配置:
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(true);
常见异常2:SQLSyntaxErrorException(语法错误)
典型原因:SQL语句包含保留字或字段名错误。使用反引号转义保留字,例如:
SELECT `user`.`group` FROM `user`
预编译SQL时避免字符串拼接,使用PreparedStatement防止SQL注入。
常见异常3:DataTruncation(数据截断)
触发条件:插入数据超过字段长度限制。解决方案:通过DatabaseMetaData获取字段元信息,插入前校验长度:
ResultSet rs = metaData.getColumns(null, null, "table_name", "column_name");
int columnSize = rs.getInt("COLUMN_SIZE");
常见异常4:DeadlockLoserDataAccessException(死锁)
处理方法:减少事务粒度,缩短持有锁的时间。在事务中按固定顺序访问多张表,必要时使用SELECT ... FOR UPDATE明确锁范围。MySQL日志分析工具:
SHOW ENGINE INNODB STATUS;
常见异常5:DuplicateKeyException(唯一键冲突)
解决方案:使用INSERT IGNORE或ON DUPLICATE KEY UPDATE语法。批量插入时捕获异常继续执行:
try {
jdbcTemplate.batchUpdate(sql, batchArgs);
} catch (DuplicateKeyException e) {
logger.warn("Duplicate key skipped");
}
常见异常6:CannotGetJdbcConnectionException(连接池耗尽)
优化方向:调整连接池参数如maxActive、maxWait。推荐配置(以HikariCP为例):
maximumPoolSize: 20
connectionTimeout: 30000
idleTimeout: 600000
常见异常7:ResultSetClosedException(结果集已关闭)
预防措施:避免在遍历结果集时关闭Connection。使用try-with-resources确保资源释放:
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// 处理结果集
}
常见异常8:TransactionRollbackException(事务回滚)
关键点:检查事务隔离级别和超时设置。Spring中配置事务属性:
@Transactional(isolation = Isolation.READ_COMMITTED, timeout = 30)
常见异常9:TypeMismatchException(类型不匹配)
处理方法:实体类字段与数据库类型严格对应。DATETIME类型推荐用java.time.LocalDateTime,BIGINT对应Long而非Integer。
常见异常10:LockWaitTimeoutException(锁等待超时)
优化策略:长事务拆分为短事务,必要时使用SET innodb_lock_wait_timeout=50临时调整等待时间。监控锁等待:
SELECT * FROM performance_schema.events_waits_current;
通过系统日志监控(如ELK收集分析MySQL慢查询日志)可提前发现潜在问题。定期执行EXPLAIN分析查询性能,索引优化遵循最左前缀原则。
1261

被折叠的 条评论
为什么被折叠?



