【发布时间】:2019-06-22 05:53:30
【问题描述】:
我正在 Spring Boot 中创建内存石英调度程序,但出现连接错误。 我有一个连接的数据库“oracle”。一旦我运行,我就会收到以下错误。谁能帮忙
ERROR [http-nio-80-exec-1] org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.quartz.JobPersistenceException: Failed to obtain DB connection from data source 'myDS': java.sql.SQLException: Connections could not be acquired from the underlying database!
这是我的quartz.properties 文件
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.makeSchedulerThreadDaemon = true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.makeThreadsDaemons = true
#org.quartz.threadPool.threadCount= 20
#org.quartz.threadPool.threadPriority= 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.misfireThreshold=25000
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=false
org.quartz.jobStore.dataSource=myDS
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.myDS.driver = oracle.jdbc.pool.OracleDataSource
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@x.x.x.x:1521:fdf
org.quartz.dataSource.myDS.user = username
org.quartz.dataSource.myDS.password = password
org.quartz.dataSource.myDS.maxConnections = 5
org.quartz.dataSource.myDS.validationQuery = select 1
这就是我在 Controller 类中创建调度程序的方式
@RequestMapping("/start")
public String start() throws SchedulerException {
Scheduler scheduler;
SchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzProperties());
scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail =
JobBuilder.newJob(Job1.class)
.usingJobData("job1", "description")
.storeDurably(true)
.requestRecovery(true)
.build();
scheduler.scheduleJob(jobDetail, Trigger1.fire());
scheduler.start();
return "redirect:/";
}
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
和 Job1.class
@Slf4j
public class Job1 implements Job {
@Override
public void execute(JobExecutionContext jobContext) {
JobDetail jobDetail = jobContext.getJobDetail();
log.info(
"\nname: {}, \nstart: {}, \nnext: {}",
jobDetail.getJobDataMap().getString("job 1"),
jobContext.getFireTime(),
jobContext.getNextFireTime());
}
}
这是 Trigger1 类
public class Trigger1 {
public static Trigger trigger;
public static Trigger fire() {
trigger =
TriggerBuilder.newTrigger()
.withIdentity("trigger 1")
.startAt(new Date())
.withSchedule(CronScheduleBuilder.cronSchedule("/1 * * ? * * *"))
.build();
return trigger;
}
}
此外,我在我的数据库 tables_oracle.sql 中运行这个 sql 脚本
【问题讨论】:
-
防火墙?权限?
-
我认为我的代码有错误。不知道在哪里
-
您的错误之一是您手动启动了调度程序。每次执行该方法时都会启动一个调度程序。相反,您应该让 Spring 使用适当的类启动和配置调度程序,这样您就可以使用 Spring Boot 配置的数据源并将其注入调度程序。
-
堆栈跟踪不完整。您的日志中的堆栈跟踪中必须存在 ORA 错误。请再次检查日志。
标签: java spring oracle spring-boot quartz