[JAVA] ORA-08177, wenn Spring Batch kontinuierlich in Oracle ausgeführt wird

Phänomen

Starten Sie den Job fast ohne Lücke, wie im folgenden Code beschrieben.

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)

Wenn ich das mache, bekomme ich folgenden Fehler:

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:Der Zugriff für diese Transaktion kann nicht serialisiert werden
; nested exception is java.sql.SQLException: ORA-08177:Der Zugriff für diese Transaktion kann nicht serialisiert werden

	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)

Die Ursache hierfür ist [Spring Batch ORA-08177: Zugriff für diese Transaktion kann nicht serialisiert werden, wenn ein einzelner Job ausgeführt wird, SERIALISIERTE Isolationsstufe](https://stackoverflow.com/questions/22364432/spring-batch-ora-08177-cant] -serialize-access-for-this-transaction-when-running) wird geschrieben.

Lösung

Sie können also `` `IsolationLevel``` in READ_UNCOMMITTED </ code> ändern.

@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, wenn Spring Batch kontinuierlich in Oracle ausgeführt wird
Schleifenschritt mit Spring Batch
Verhalten, wenn jedes im umgekehrten Bereich ausgeführt wird
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Was ist @Autowired im Spring Boot?
Die Ereignisverarbeitung wird im Frühjahr durchgeführt.
So lösen Sie das Problem, dass die Bean beim Verschachteln in Spring Batch nicht ordnungsgemäß verarbeitet wird
Anfangswert, wenn die Spring-Anforderung keine Eigenschaft des Formularobjekts enthält
Spring Autowired wird im Konstruktor geschrieben
Fehler bei der Implementierung bei der Implementierung der Spring-Validierung
Verhalten, wenn Platzhalter (**) in Ruby angegeben ist
Spring MVC: Verhalten, wenn "@ RequestParam" weggelassen wird
Das @ Import-Ziel wird im Frühjahr als @ Konfiguration behandelt
Zusammenfassung dessen, was ich in Spring Batch gelernt habe
Wenn das Projekt nicht in Eclipse angezeigt wird
Ebean.update () wird im geerbten Modell nicht ausgeführt.