[JAVA] ORA-08177 lorsque Spring Batch est exécuté en continu dans Oracle

phénomène

Lancez le travail avec presque aucun espace, comme dans le code ci-dessous.

ExecutorService s = Executors.newFixedThreadPool(2);

long time1 = new Date().getTime();
long time2 = time1 + 111111000;
s.execute(() -> doBatch(time1));
s.execute(() -> doBatch(time2));

void doBatch(long t) {
    Map<String, JobParameter> p = new HashMap<String, JobParameter>();
    p.put("a", new JobParameter(new Date(t)));
    JobParameters jobParameters = new JobParameters(p);
    l.run(job, jobParameters)

Lorsque je fais cela, j'obtiens l'erreur suivante:

Exception in thread "pool-1-thread-1" org.springframework.dao.CannotSerializeTransactionException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; ORA-08177:Impossible de sérialiser l'accès pour cette transaction
; nested exception is java.sql.SQLException: ORA-08177:Impossible de sérialiser l'accès pour cette transaction

	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:270)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632)

La cause en est [Spring Batch ORA-08177: impossible de sérialiser l'accès pour cette transaction lors de l'exécution d'une tâche unique, niveau d'isolement SERIALIZED](https://stackoverflow.com/questions/22364432/spring-batch-ora-08177-cant] -serialize-access-for-this-transaction-when-running) est écrit.

Solution

Vous pouvez donc changer IsolationLevel en READ_UNCOMMITTED </ code>.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration1 extends DefaultBatchConfigurer {
    @Autowired
    DataSource configDataSource;

    @Autowired
    PlatformTransactionManager configTxManager;

    @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
        factoryBean.setDataSource(configDataSource);
        factoryBean.setTransactionManager(configTxManager);
        factoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
        factoryBean.setTablePrefix("BATCH_");
        try {
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        } catch (Exception e) {
            throw new BatchConfigurationException(e);
        }
    }

Recommended Posts

ORA-08177 lorsque Spring Batch est exécuté en continu dans Oracle
Étape de boucle avec Spring Batch
Comportement lorsque chacun est exécuté dans la plage inverse
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Qu'est-ce que @Autowired dans Spring Boot?
Le traitement des événements est effectué au printemps.
Comment résoudre le problème que le bean n'est pas traité correctement lorsqu'il est imbriqué dans Spring Batch
Valeur initiale lorsqu'il n'y a pas de propriété de l'objet de formulaire dans la requête Spring
Spring Autowired est écrit dans le constructeur
Erreur de mise en œuvre lors de la mise en œuvre de la validation Spring
Comportement lorsque le caractère générique (**) est spécifié dans ruby
Spring MVC: Comportement lorsque `@ RequestParam` est omis
La cible @Import est traitée comme @Configuration au printemps
Résumé de ce que j'ai appris dans Spring Batch
Lorsque le projet n'est pas affiché dans eclipse
Ebean.update () n'est pas exécuté dans le modèle hérité.