Spring Boot Quartz配置public以外的schema不生效如何解决
Quartz自定义schema存储数据表问题解决方法
报错的核心原因是仅修改了Quartz查询表的前缀,但Quartz数据表实际仍创建在public schema下,同时未给数据库用户开放quartz schema的对应权限,导致Quartz查询目标表不存在触发事务异常,后续锁操作被拒绝。按照以下步骤即可解决:
步骤1:调整Quartz初始化配置
关闭Spring Boot自带的Quartz表自动初始化能力,该能力默认只会将表创建到public schema,无法识别前缀中配置的自定义schema:
# 将原配置的always改为never spring.quartz.jdbc.initialize-schema=never
步骤2:提前创建quartz schema并授权
登录PostgreSQL执行以下SQL,创建专属schema并给应用使用的数据库账号授权:
-- 创建quartz schema CREATE SCHEMA IF NOT EXISTS quartz; -- 替换为你应用连接数据库的用户名 GRANT USAGE, CREATE ON SCHEMA quartz TO your_db_user; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA quartz TO your_db_user; ALTER DEFAULT PRIVILEGES IN SCHEMA quartz GRANT ALL PRIVILEGES ON TABLES TO your_db_user;
步骤3:在quartz schema下创建Quartz依赖表
找到Quartz官方提供的PostgreSQL建表脚本(路径为Quartz jar包内org/quartz/impl/jdbcjobstore/tables_postgres.sql),执行脚本前先切换schema:
SET search_path TO quartz; -- 粘贴tables_postgres.sql的全部内容执行即可,所有QRTZ_开头的表都会创建到quartz schema下
步骤4:确认最终配置
你的tablePrefix配置无需修改,完整的核心配置参考如下:
spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=never spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=2000 spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.useProperties=false spring.quartz.properties.org.quartz.jobStore.tablePrefix=quartz.QRTZ_ # 可选配置:配置数据源默认搜索路径,方便后续业务侧直接访问quartz表 spring.datasource.hikari.connection-init-sql=SET search_path TO public,quartz;
原有配置类无需做任何修改,重启应用即可正常使用quartz schema存储定时任务数据。
内容的提问来源于stack exchange,提问作者UnguruBulan
相关产品推荐
相关产品推荐

