Пакет завис из-за удаления значения таблицы метаданных - PullRequest
0 голосов
/ 06 июня 2019

Пакетное приложение My Spring зависает при одновременном запуске нескольких пакетов с огромными данными.Получение приведенного ниже исключения

Blocked resource    ridlock fileid=1 pageid=69265493 dbid=6 id=lock2a36e0c00 mode=X associatedObjectId=72057594039631872 
Blocked database    *****

Blocking Host (User)    ZNAPCDP1842V (myuser) 
Blocking application    jTDS 

Blocking statement  N/A 
Blocking batch/sp   delete from BATCH_STEP_EXECUTION_SEQ where ID < 145678

Я использую версию с загрузочной пружиной - 1.2.5, Hibernate 4.3.5 Я НЕ использую конфигурации на основе XML

У меня есть подход, описанный в ссылке ниже

Несколько заданий Spring Batch, выполняющихся одновременно, вызывая взаимные блокировки в таблицах метаданных Spring Batch

Поскольку я использую конфигурации на основе Java, я сделал это следующим образом


@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig extends DefaultBatchConfigurer{

    @Autowired
    DataSource datasource; 

    @Autowired
    PlatformTransactionManager transactionManager; 

    @Autowired
    public void setDataSource(DataSource datasource) { 
        this.transactionManager = new DataSourceTransactionManager(datasource);
    }


    @Override
    public JobRepository createJobRepository() throws Exception{

        setDataSource(this.datasource);

        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(datasource);
        factory.setTransactionManager(transactionManager);
        factory.setIsolationLevelForCreate("ISOLATION_REPEATABLE_READ");
        factory.setTablePrefix("BATCH_");
        factory.setDatabaseType("SQLSERVER");
        factory.setMaxVarCharLength(1000);
        return factory.getObject();

    }

//Registering my job configuration beans
    }

Он работает до некоторой точки и извлекает данные из большинства запросов гибернации, но в какой-то момент выдает ниже исключения "java.lang.ClassCastException: org.hibernate.action.internal.DelayedPostInsertIdentifier не может быть приведен к java.lang.Long "

На этот раз он пытается прочитать данные из запроса ниже

@Query("SELECT tb FROM TBodyPart tb " +                             
            "WHERE tb.tPlan=?1 and LTRIM(RTRIM(tb.iBodyPart)) = LTRIM(RTRIM(?2)) and LTRIM(RTRIM(tb.iName))=LTRIM(RTRIM(?3)) and (LTRIM(RTRIM(tb.iOrientation))=LTRIM(RTRIM(?4)) OR tb.iOrientation=?4 )")
    public TBodyPart findDetailsMethod(TPlan tPlanId,String bpName,String iName,String iOrientation);

Что здесь может пойти не так ??Почему он выбирает все остальные запросы нормально, но выдает исключение только с этим ??

NB. Приведенный выше запрос работает нормально, если я удалю то, что добавил в класс AppConfig, чтобы избежать проблемы с зависанием пакета.(Factory.setIsolationLevelForCreate ( "ISOLATION_REPEATABLE_READ");).Я пробовал и другие уровни изоляции

Файл конфигурации до редактирования


@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig{
@Bean
    public ApplicationContextFactory myJobContext(){
        return new GenericApplicationContextFactory(MyJobConfiguration.class);
    }
}

После редактирования


@Autowired
    DataSource datasource; 

    @Autowired
    PlatformTransactionManager transactionManager; 

    @Autowired
    public void setDataSource(DataSource datasource) { 
        this.transactionManager = new DataSourceTransactionManager(datasource);
    }


    @Override
    public JobRepository createJobRepository() throws Exception{

        setDataSource(this.datasource);

        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(datasource);
        factory.setTransactionManager(transactionManager);
        factory.setIsolationLevelForCreate("ISOLATION_REPEATABLE_READ");
        factory.setTablePrefix("BATCH_");
        factory.setDatabaseType("SQLSERVER");
        factory.setMaxVarCharLength(10000);
        return factory.getObject();

    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...