这是在
here
同样,这似乎是@Schdeuled上的一个问题,它不适用于@Transaction。
然而,这略有不同,可能是代码中处理的事务的问题。
我正在运行一个计划程序,它每天都会启动(DailyScheduler.processDailyScheduler()),但由于以下错误而失败
SQL错误:17008,SQLState:08003
javax。坚持不懈持久性异常:
组织。冬眠例外JDBCConnectionException:无法执行
查询位置
组织。冬眠jpa。spi。AbstractEntityManagerImpl。转换(AbstractEntityManagerImpl.java:1692)
在
组织。冬眠jpa。spi。AbstractEntityManagerImpl。转换(AbstractEntityManagerImpl.java:1602)
在
组织。冬眠jpa。内部的查询示例。getResultList(QueryImpl.java:492)
原因:java。sql。SQLRecoverableException:关闭的连接:下一步
我还有一个控制器(DailyController.processDailyJob),它完全执行相同的作业,但当我使用相同的输入运行时会成功。
我不明白为什么我的调度程序没有通过,控制器总是工作。
在此方面的任何帮助都将不胜感激!
非常感谢。
DailyScheduler:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class DailyScheduler {
@Autowired
DailyService dailyService;
@Scheduled(cron = "${daily.scheduler.cron}")
public void processDailyScheduler() {
log.info("DailyScheduler starts");
dailyService.processDailyJob(new Date());
log.info("DailyScheduler finishes");
}
}
每日控制器:
@Slf4j
@RestController
@ApiIgnore
public class DailyController {
@Autowired
DailyService dailyService;
@RequestMapping(value = {"/v1/daily/job/{jobDate}"}, method = RequestMethod.POST)
public ResponseEntity<String> processDailyJob(@PathVariable("jobDate") String jobDate,
@RequestHeader(SIFAuthorization.AUTHORIZATION) String authorizationToken)
throws Exception {
SimpleDateFormat dateFormatter =new SimpleDateFormat("dd-MMM-yyyy");
Date targetDate =dateFormatter.parse(jobDate);
dailyService.processDailyJob(targetDate);
return new ResponseEntity<>("Daily Job Processed.", HttpStatus.OK);
}
}
DailyServiceImpl:
@Slf4j
@Service
public class DailyServiceImpl implements DailyService {
@Autowired
private UserServiceRepository userServiceRepository;
@Override
public Integer processDailyJob(Date targetDate) {
userServiceRepository.findUser(targetDate);
}
}
UserServiceRepository:
@Transactional(readOnly = true)
public interface UserServiceRepository extends JpaRepository<UserDailySummary, String> {
UserDailySummary findUser(Date targetDate);
}
数据库配置:
@Configuration
@Profile("!test")
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dbEntityManagerFactory",
transactionManagerRef = "dbTransactionManager",
basePackages = {"com.org.dub.mmm"})
@EnableConfigurationProperties(DbProperties.class)
@Slf4j
public class DatabaseConfig {
@Autowired
private DbProperties dbProperties;
@Bean(name = "dataSource")
@Primary
public DataSource dataSource() {
PoolProperties poolProperties = new PoolProperties();
poolProperties.setUrl(dbProperties.getJdbcUrl());
poolProperties.setDriverClassName(dbProperties.getDriverClassName());
poolProperties.setUsername(dbProperties.getUser());
poolProperties.setPassword(dbProperties.getPassword());
// override the default value
poolProperties.setTestOnBorrow(true);
poolProperties.setTestWhileIdle(true);
poolProperties.setValidationQuery(dbProperties.getValidationQuery());
poolProperties.setRemoveAbandoned(true);
DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
return dataSource;
}
@Bean
PlatformTransactionManager dbTransactionManager() {
return new JpaTransactionManager(dbEntityManagerFactory().getObject());
}
@Bean
@Primary
LocalContainerEntityManagerFactoryBean dbEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean factoryBean = null;
HibernateJpaVendorAdapter vendorAdapter =
new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.ORACLE);
factoryBean = new LocalContainerEntityManagerFactoryBean();
DataSource dataSource = dataSource();
factoryBean.setDataSource(dataSource);
factoryBean.setJpaVendorAdapter(vendorAdapter);
factoryBean.setJpaProperties(additionalJpaProperties());
factoryBean.setPackagesToScan(new String[]{"com.org.dub.mmm.domain"});
factoryBean.afterPropertiesSet();
return factoryBean;
}
Properties additionalJpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
properties.setProperty("hibernate.cache.use_second_level_cache", "true");
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
return properties;
}
}