MySQL调度器刷新全文索引致表锁,Tomcat HTTP请求失败求助
解决表锁导致Tomcat HTTP请求失败的方案
一、优化DDL操作,缩短锁表时长
- 利用MySQL在线DDL特性(MySQL 5.6及以上版本支持),修改ALTER语句添加算法和锁策略参数,避免长时间独占表资源:
ALTER TABLE some_table DROP INDEX full_text, ALGORITHM=INPLACE, LOCK=NONE; ALTER TABLE some_table ADD FULLTEXT INDEX full_text (description) VISIBLE, ALGORITHM=INPLACE, LOCK=NONE;注意:全文索引的增删操作在MySQL 8.0版本对INPLACE算法支持更完善,需确认当前MySQL版本的兼容性。
二、调整Tomcat连接池配置,提升连接容错性
在连接池URL中补充连接超时与自动重连参数,让连接池自动回收阻塞/失效的连接:
<Resource name="myDatasource" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="username" password="password" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb?useOldAliasMetadataBehavior=true&autoReconnect=true&autoReconnectForPools=true&connectTimeout=5000&socketTimeout=30000"/>autoReconnect/autoReconnectForPools:开启连接池自动重连机制connectTimeout:设置连接超时阈值,避免线程长时间等待锁释放socketTimeout:设置Socket读写超时,防止连接卡在阻塞状态
增加连接有效性验证配置,确保获取的连接可用:
在Resource标签中添加以下参数:testOnBorrow="true" validationQuery="SELECT 1" validationInterval="30000"testOnBorrow:获取连接前自动验证连接状态validationQuery:轻量验证SQLvalidationInterval:设置验证间隔,避免频繁执行验证操作
三、调整调度执行策略,降低业务影响
- 选择业务低峰期(如凌晨)执行索引刷新任务,减少对用户请求的干扰
- 若采用主从架构,可先在从库执行DDL,切换主从后再在原主库执行,分散锁表影响
四、替换索引刷新方式,规避DDL操作
- 改用增量更新逻辑,避免全量删除重建索引:MySQL 8.0可使用
ALTER TABLE some_table FORCE INDEX(full_text)触发索引重建,但仍需注意锁表风险 - 考虑用Elasticsearch等第三方检索工具替代MySQL原生全文索引,彻底消除DDL锁表对业务的影响
内容的提问来源于stack exchange,提问作者Pradyut Bhattacharya
相关产品推荐
相关产品推荐

