Java Spring boot@Scheduled失败SQL错误:17008,SQLState:08003
这是在中再次提出的类似问题,这似乎是@Schdeuled上的问题,它不适用于@Transaction。 然而,这略有不同,可能是代码中处理的事务的问题 我正在运行一个计划程序,它每天启动(DailyScheduler.processDailyScheduler()),但由于以下错误而失败 SQL错误:17008,SQLState:08003 javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException:无法执行 查询 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 在 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:492) 原因:java.sql.SQLRecoverableException:关闭的连接:下一步 我还有一个控制器(DailyController.processDailyJob),它执行完全相同的任务,但是当我使用相同的输入运行时,它会成功 我不明白为什么我的调度程序没有通过,控制器总是工作 在此方面的任何帮助都将不胜感激! 谢谢大家! 每日调度程序:Java Spring boot@Scheduled失败SQL错误:17008,SQLState:08003,java,spring,spring-boot,scheduled-tasks,spring-transactions,Java,Spring,Spring Boot,Scheduled Tasks,Spring Transactions,这是在中再次提出的类似问题,这似乎是@Schdeuled上的问题,它不适用于@Transaction。 然而,这略有不同,可能是代码中处理的事务的问题 我正在运行一个计划程序,它每天启动(DailyScheduler.processDailyScheduler()),但由于以下错误而失败 SQL错误:17008,SQLState:08003 javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnection
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);
}
}
@Slf4j
@Service
public class DailyServiceImpl implements DailyService {
@Autowired
private UserServiceRepository userServiceRepository;
@Override
public Integer processDailyJob(Date targetDate) {
userServiceRepository.findUser(targetDate);
}
}
@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;
}
}
每日控制器:
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);
}
}
@Slf4j
@Service
public class DailyServiceImpl implements DailyService {
@Autowired
private UserServiceRepository userServiceRepository;
@Override
public Integer processDailyJob(Date targetDate) {
userServiceRepository.findUser(targetDate);
}
}
@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;
}
}
UserServiceRepository:
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);
}
}
@Slf4j
@Service
public class DailyServiceImpl implements DailyService {
@Autowired
private UserServiceRepository userServiceRepository;
@Override
public Integer processDailyJob(Date targetDate) {
userServiceRepository.findUser(targetDate);
}
}
@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;
}
}
我认为问题与标记
removeAbandoned=true
有关。此属性与另一个属性一起工作,即RemoveBandonedTimeout
。引用与此相关的参考文献:
(int)以秒为单位的超时,然后才能删除放弃的(正在使用的)连接。默认值为60(60秒)。该值应设置为应用程序可能具有的运行时间最长的查询
因此,您的
abbandoned
连接似乎在1分钟后全部删除 您可以共享到db文件的连接吗?@NiVeR我已经更新了db配置。您的工作(查询)是否可能需要1分钟以上?@n实际上,当我手动触发对DB的查询时,需要6到9秒,比较日志中的时间戳,在计划程序任务启动1或2分钟后,我会看到失败错误消息的尾部。回答你的问题是的,这项工作需要一分钟以上的时间。非常感谢!这正好说明了@scheduled失败的原因。当我触发控制器1时,最多只需要40秒。很高兴它起到了作用。如果答案有帮助,请投票/接受。嘿,你当时是怎么解决的。您到底在哪里更改了此标志的值?