记遇到的问题

2021-11-01  本文已影响0人  SILENCE_SPEAKS
1. @Qualifier("beanName")
在引用注入时,使用@Qualifier注解来指定注入

2. @Primary
在定义新的Bean时,用于声明优先注入
1. SQL语句中加一个DISTINT函数,这样PageHelper插件执行统计函数时便不会替换查询字段,而把之前的查询语句当作一个子表去重新包裹指定统计函数

2. 手动修改原SQL语句为嵌套的子表查询

解决方法:

# 应急方法:
1. show full processlist; 找出出现问题的进程;
2. kill掉出现问题的进程。

# 根本解决办法:
1. select * from information_schema.innodb_trx;  查看有是哪些事务占据了表资源
2. 找到对应的程序代码,如原因二是嵌套事务导致,可以把主事务中因为未命中索引导致的锁表操作进行修改,避免锁表

# 其他办法:
增加锁等待时间,即增大下面配置项参数值,单位为秒(s) innodb_lock_wait_timeout=500
优化存储过程,事务避免过长时间的等待

间隙锁相关可参考以下两篇文章:
间隙锁详解
MySQL的锁机制 - 记录锁、间隙锁、临键锁

# 方法一:
在加锁执行的代码中,新增个处理标记,声明此段代码已被处理过,无需重复处理
如:在redis中设置个有期限的唯一标识(有效期根据实际运行场景规定)

# 方法二:
可以在存信息的数据库表中新增唯一索引来确保数据的唯一性

推荐两种方法一,方法二结合使用

# 方法三:
把锁内的代码片段抽取出来单独声明事务,确保锁释放是在事务提交后进行的
# 报错信息
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
1. 避免出现空值列(赋予默认值)
2. 用 `or` 连接一个为空的条件 `is null`
例如:column_1 is null or column_1 not in (1,2)
[ERROR] - com.alibaba.druid.pool.DruidDataSource.removeAbandoned(DruidDataSource.java:2979) - abandon connection, owner thread: xxx, connected at : xxx, open stackTrace

解决办法:

1. 将removeAbandoned这个配置设置为false或者不设置(默认就是false)

或者

2. 将removeAbandonedTimeoutMillis这个时间配置调大
# 时间设置为30分钟(单位:秒)
remove-abandoned-timeout: 1800
# 时间设置为30分钟(单位:毫秒)
remove-abandoned-timeout-millis: 1800000
配置 默认值 说明
removeAbandoned false 是否强制关闭连接时长大于removeAbandonedTimeoutMillis的连接
removeAbandonedTimeoutMillis 300 * 1000 (单位:毫秒) 一个连接从被连接到被关闭之间的最大生命周期
logAbandoned false 强制关闭连接时是否记录日志
上一篇 下一篇

猜你喜欢

热点阅读