代码之家  ›  专栏  ›  技术社区  ›  Naveen qamnott

Spring boot@Scheduled fails SQL错误:17008,SQLState:08003

  •  2
  • Naveen qamnott  · 技术社区  · 8 年前

    这是在 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;
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   NiVeR    8 年前

    我认为问题与国旗有关 removeAbandoned=true 。该物业与另一物业(即 removeAbandonedTimeout .引用与此相关的参考文献:

    (int)删除废弃(正在使用)连接之前的超时(以秒为单位)。默认值为60(60秒)。该值应设置为应用程序可能具有的运行时间最长的查询。

    看来你所有的 abbandoned 1分钟后断开连接。

    推荐文章