Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring boot@Scheduled失败SQL错误:17008,SQLState:08003_Java_Spring_Spring Boot_Scheduled Tasks_Spring Transactions - Fatal编程技术网

Java Spring boot@Scheduled失败SQL错误:17008,SQLState:08003

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

这是在中再次提出的类似问题,这似乎是@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),它执行完全相同的任务,但是当我使用相同的输入运行时,它会成功

我不明白为什么我的调度程序没有通过,控制器总是工作

在此方面的任何帮助都将不胜感激! 谢谢大家!

每日调度程序:

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秒。很高兴它起到了作用。如果答案有帮助,请投票/接受。嘿,你当时是怎么解决的。您到底在哪里更改了此标志的值?