提问者:小点点

在Spring批次中找不到产品名称的数据库类型:[Apache Hive]


由于找不到任何解决方案,我们遵循了Spring批留档4.3.4 Repository中的非标准数据库类型一节中提供的指南(尽管有限)
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html

>

  • 使用自定义类JobRepositoryFactoryBean扩展JobRepositoryFactoryBeanForHive
  • 实现了SimpleJobRepository所依赖的各种DAO接口。这样做是为了控制这些DAO实现,因为它们负责将批处理元数据持久化到数据库中。

    1. JobInstance道(HiveJdbcJobInstance道
    2. JobExecution道(HiveJdbcJobExecution道
    3. 步骤执行道(HiveJdbcStepExecution道
    4. 执行上下文道(JdbcHiveExecutionContext道

    Hive不支持序列。作为一种解决方法,创建一个表来添加/增加Id并继续检索每次命中表的最大值

    实现了Hive增量工厂(用于创建Hive增量中心实现的工厂)和相关的Hive增量中心(从为序列创建的表中检索下一个值)

    修改了JobRepositoryFactoryBeanForHive中方法的实现,将Types设置为VARCHAR。在数据库中,字段SERIALIZED_CONTEXT已用datatype声明为VARCHAR,因为Hive不支持CLOB。最大时,可以存储2 GB。(由于Oracle中的CLOB可以是8 GB,如果每个字段超过2 GB,是否应该创建3个字段来通过拆分来存储上下文)

    <bean id="jobRepository" class="com.batch.springutil.JobRepositoryFactoryBeanForHive">
          <property name="dataSource" ref="DataSource" />
          <property name="databaseType" value="oracle" />  
          <property name="incrementerFactory" ref="hiveIncrementerFactory" />
          <property name="transactionManager" ref="transactionManager" />
          <property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
    </bean> 
    <bean id="hiveIncrementerFactory" class="com.batch.springutil.HiveIncrementerFactory">
              <constructor-arg ref="DataSource" /> 
    </bean>
    

    实现自定义类JsrJobParametersConverterHive扩展JsrJobParametersConverter

    <bean id="jobParametersConverter" class="com.batch.springutil.JsrJobParametersConverterHive">
          <constructor-arg ref="BatchDataSource" />
    </bean>
    

  • 共1个答案

    匿名用户

    根据文档第4.3.4节存储库中的非标准数据库类型:

    如果这也不起作用,或者你没有使用RDBMS,那么唯一的选择可能是实现SimpleJobRepository依赖的各种道接口,并以正常的Spring方式手动连接一个。

    由于您已经实现了作业存储库所依赖的4个DAO,因此您可以创建一个类型为SimpleJobRepository的bean并将您的DAO连接到其中。换句话说,不要使用JobRepositoryFactoryBean并自己创建bean:

    @Bean
    public SimpleJobRepository hiveJobRepository(
        HiveJdbcJobInstanceDao hiveJdbcJobInstanceDao,
        HiveJdbcJobExecutionDao hiveJdbcJobExecutionDao,
        HiveJdbcStepExecutionDao hiveJdbcStepExecutionDao,
        JdbcHiveExecutionContextDao jdbcHiveExecutionContextDao) {
    
        return new SimpleJobRepository(hiveJdbcJobInstanceDao, hiveJdbcJobExecutionDao,
                                   hiveJdbcStepExecutionDao, jdbcHiveExecutionContextDao);
    }