Avoiding SQLite Database Locks in Production
7 days ago
- #Background Jobs
- #SQLite
- #Rails
- 文章讨论了在使用Solid Queue的Rails应用中遇到SQLite3::BusyException的问题,这是由于SQLite的单写锁机制导致的。
- 关键解决方案包括正确配置SQLite的busy_timeout和timeout为相同值、启用WAL模式,以及优化synchronous和mmap_size等pragma设置。
- deploy.yml中的配置错误(SOLID_QUEUE_IN_PUMA环境变量)导致Solid Queue运行两次,从而引发锁问题;修复该配置后问题得到解决。
- Solid Queue中的周期性任务应合理安排执行时间以避免同时运行,从而通过记录异常发生时间来定位锁问题的根源。
- 避免在任务中使用.find_each进行批量更新,因为它会保持读游标打开;应改用pluck获取ID并以小批量处理,以快速释放锁。
- 创建了一项opencode技能来预防SQLite锁问题,指导AI代理在写入时避免使用读游标,并通过事务进行批量写入。