弹簧启动棚锁 "relation "棚锁 " does not exist"



我将ShedLock添加到我的项目中,以防止计划作业多次工作。我像下面这样配置它,但是我得到了

"org.postgresql.util。psqexception: ERROR: relation "shedlock"不存在"错误。

这是lockProviderBean:

@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime() 
.build()
);
}

这是调度作业:

@Scheduled(cron = "${cronProperty:0 00 23 * * *}")
@SchedulerLock(name = "schedulerLockName")
public void scheduledJob() {
..............
}

我将这些注释添加到包含schduledJob方法的类:

@EnableScheduling
@Component
@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "2m")

我正在使用Spring Data做数据库操作,并使用这些属性:

spring.datasource.url = jdbc:postgresql://ip:port/databaseName?currentSchema=schemeName
spring.datasource.driver-class-name = org.postgresql.Driver
spring.jpa.database = postgresql
spring.datasource.platform = postgresql
spring.datasource.hikari.maximum-pool-size=5
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.username = username
spring.datasource.password = password

您必须按照文档中的描述创建表。

也许这就是你所缺少的:

如果需要指定模式,可以在表名中设置使用常用的点表示法"my_schema.shedlock"

我也面临这个问题即使夏德罗克表已创建。

解决这个问题的方法是
  1. 使用ALTER ROLE YourPgUser SET search_path TO ...
  2. 设置pg的用户默认模式
  3. 在LockProvider bean上指定shedlock模式
@Bean
public LockProvider getLockProvider(@Autowired JdbcTemplate jdbcTemplate) {
jdbcTemplate.execute("SET search_path TO domaindbschema");
return new JdbcTemplateLockProvider(jdbcTemplate);
}

或其他样式

@Bean
public LockProvider getLockProvider(@Autowired JdbcTemplate jdbcTemplate) {
return new JdbcTemplateLockProvider(jdbcTemplate, "domaindbschema.shedlock");
}

如果这是在服务器中,则需要修改表的权限。联系BD团队

最新更新