Spring批处理 - oracle连接关闭

时间:2017-12-12 00:57:50

标签: java spring-boot spring-data-jpa spring-batch

我在春季启动应用程序中遇到了一个奇怪的问题,搜索了很多,但答案没有运气。基本上,我已经配置了一个非常简单的弹簧批处理作业,包括阅读器,处理器和编写器,我也有自己的数据源配置。

我只配置了一个作业,并且会有多个具有不同参数的同一作业的调用。也就是说,同一个作业URL将同时触发(10)不同的输入,并且所有内容都将并行运行。每个jobStep都有4个线程的节流,因此所有10个作业实例将跨越4个并行产生40个线程。

我每天遇到这种方法有两个问题,无法弄清楚问题,

  1. 一旦应用程序启动并且第一次触发作业,所有10个作业实例(具有不同的输入)将成功完成。没问题。但是,在10个小时之后,如果我们尝试同时用另外10个输入触发相同的作业实例,则所有作业都会因以下原因而失败。
  2.   

    o.s.b.c.l.support.SimpleJobLauncher:Job:[FlowJob:   [name = marketing-job]]使用以下参数完成:   [{time = 1513023822300,jobInput =“CustomerA”]及以下状态:   [FAILED]   o.s.batch.core.step.AbstractStep:遇到错误   在工作营销工作中执行步骤jobStep   o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:17008,SQLState:   08003 o.h.engine.jdbc.spi.SqlExceptionHelper:Closed Connection

    连接关闭时出错。我已经设置了testOnBorrow,它应该确保池连接对作业有效,但这似乎不起作用。尝试使用testOnIdle但没有运气......

    1. 有时,即使在第一次运行期间,在读取器中获取数据库连接也会在实际获得连接之前卡住大约10-15分钟。不知道为什么会发生这种情况。
    2. 有人遇到过这些问题吗?有人可以帮我解决这个问题吗?

      已在下面给出了作业和数据源的配置。

      JOBConfig:

      @Configuration
      @EnableTransactionManagement
      @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",
          transactionManagerRef = "transactionManager",
          basePackages = "com.sample")
      public class DatasourceConfig {
      
        @Primary
        @Bean(name = "dataSourcePrimary", destroyMethod = "")
        public DataSource dataSource() {
          BasicDataSource dataSource = new BasicDataSource();
      
            dataSource.setInitialSize(50);
            dataSource.setMaxIdle(50);
            dataSource.setMaxTotal(60);
            dataSource.setValidationQuery("select 1 from dual");
            dataSource.setValidationQueryTimeout(10);
            dataSource.setTestOnBorrow(true);
            dataSource.setTestWhileIdle(true);
            //dataSource.setMinEvictableIdleTimeMillis(600000);
            //dataSource.setTimeBetweenEvictionRunsMillis(600000);
      
          return dataSource;
      
        }
      
        @Primary
        @Bean(name = "entityManagerFactoryPrimary")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("dataSourcePrimary") DataSource dataSource) {
          return builder.dataSource(dataSource).packages("com.sample.entity")
              .persistenceUnit("primary").build();
        }
      
        @Primary
        @Bean(name = "transactionManager")
        public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactoryPrimary") EntityManagerFactory entityManagerFactoryPrimary) {
          return new JpaTransactionManager(entityManagerFactoryPrimary);
        }
      
        @Primary
        @Bean(name = "entityManagerPrimary")
        public EntityManager entityManager(
            @Qualifier("entityManagerFactoryPrimary") EntityManagerFactory entityManagerFactoryPrimary) {
          return entityManagerFactoryPrimary.createEntityManager();
        }
      }
      

      DataSourceConfig:

      @Component
      @StepScope
      @RefreshScope
      public class Reader
          implements ItemReader<A>, StepExecutionListener {
      
        private List<A> a;
      
        @Override
        public void beforeStep(StepExecution stepExecution) {
          List<A> aList =
              new ArrayList<A>();
           // code to populate the data list 'a' from DB.
        }
      
        @Override
        public ExitStatus afterStep(StepExecution stepExecution) {
          // TODO Auto-generated method stub
          return null;
        }
      
        @Override
        public synchronized A read() {
          if (a.size() > 0) {
            return a.remove(0);
          }
          return null;
        }
      
      }
      
      
      @Component
      public class Writer implements ItemWriter<A> {
      
        @Override
        public void write(List<? extends A> a) {
      
          // get 'a' and write 
        }
      
      }
      

      更新:添加了Reader&amp;作者根据请求

      {{1}}

0 个答案:

没有答案