

Beim Versuch, zwei oder mehr Spring Batch-Jobs gleichzeitig zu starten, wird ein Fehler ausgegeben: ORA-08177: Der Zugriff für diese Transaktion konnte nicht serialisiert werden
php-Editor Xigua kann bei der Verwendung von Spring Batch auf ein Problem stoßen: Beim Versuch, zwei oder mehr Spring Batch-Jobs gleichzeitig zu starten, wird ein Fehler ausgegeben: ORA-08177: Der Zugriff auf diese Transaktion kann nicht serialisiert werden. Dieser Fehler mag verwirrend sein, wird jedoch tatsächlich durch ein Problem mit der Datenbanksperre verursacht. Bevor wir dieses Problem lösen können, müssen wir einige Hintergrundkenntnisse über Spring Batch und Datenbanktransaktionen verstehen.
Frageninhalt
Beim Versuch, mit completablefuture zwei Spring-Batch-Jobs parallel auszuführen, ist ein Fehler aufgetreten. Die Fehlermeldung lautet wie folgt:
originalsql = insert into batch_job_instance(job_instance_id, job_name, job_key, version) values (?, ?, ?, ?) , error msg = ora-08177: can't serialize access for this transaction
Ich verwende Spring Batch 5.x, Spring Boot 3.1.6, JDK 17
Anwendungseigenschaften
spring.batch.repository.isolationlevelforcreate=isolation_read_committed spring.batch.isolationlevel=read_committed spring.batch.jdbc.table-prefix=batch_ spring.batch.job.enabled=false
batchconfig.java
@configuration public class batchconfig { @bean("simpletaskexecutor") public taskexecutor simpletaskexecutor() { simpleasynctaskexecutor asynctaskexecutor = new simpleasynctaskexecutor("simpletaskexecutor"); asynctaskexecutor.setconcurrencylimit(concurrencycount); return asynctaskexecutor; } @bean("joblauncherasync") @scope("prototype") public joblauncher joblauncherasync(datasource datasource, jobrepository jobrepository) throws exception { taskexecutorjoblauncher joblauncher = new taskexecutorjoblauncher(); joblauncher.setjobrepository(jobrepository); joblauncher.settaskexecutor(simpletaskexecutor()); joblauncher.afterpropertiesset(); return joblauncher; } @bean public jpatransactionmanager transactionmanager(entitymanagerfactory entitymanagerfactory) { return new jpatransactionmanager(entitymanagerfactory); } @bean public batchjobexecutionlistener batchjobexecutionlistener() { return new batchjobexecutionlistener(); } @bean public batchjobstepexecutionlistner batchjobstepexecutionlistner() { return new batchjobstepexecutionlistner(); }
}
employeejobconfig.java
@configuration @import(batchconfig.class) public class employeejobconfig{ @autowired employeestatuswritter employeestatuswritter; @autowired employeependingprocessor employeependingprocessor; @bean("employeependingreader") public jpapagingitemreader<employee> employeependingreader(datasource ds,entitymanagerfactory entitymanagerfactory) { jpapagingitemreader<employee> jpareader = new jpapagingitemreader<>(); jpareader.setentitymanagerfactory(entitymanagerfactory); jpareader.setquerystring("select e from employee e"); jpareader.setpagesize(5000); return jpareader; } @bean("employeespinvokestep") public step employeespinvokestep(@qualifier("employeependingreader") itemreader<employee> reader, @qualifier("employeestatuswritter") itemwriter<employee> writer, @qualifier("employeependingprocessor") itemprocessor<employee, employee> processor,jobrepository jobrepository, platformtransactionmanager transactionmanager,batchjobstepexecutionlistner batchjobstepexecutionlistner,taskexecutor simpletaskexecutor) { return new stepbuilder("employeespinvokestep",jobrepository) .<employee, employee>chunk(50,transactionmanager).reader(reader) .processor(processor).writer(writer) .listener(batchjobstepexecutionlistner) .taskexecutor(simpletaskexecutor) .build(); } @bean("employeespjob") public job employeespjob(@qualifier("employeespinvokestep") step employeespinvokestep,jobrepository jobrepository,batchjobexecutionlistener batchjobexecutionlistener) { return new jobbuilder("employeespjob",jobrepository) .incrementer(new runidincrementer()) .listener(batchjobexecutionlistener) .start(employeespinvokestep) .build(); } }
managerconfig.java
@configuration @import(batchconfig.class) public class managerconfig { @autowired managerstatuswritter managerstatuswritter; @autowired managerpendingprocessor managerpendingprocessor; @bean("managerpendingreader") public jpapagingitemreader<manager> managerpendingreader(datasource ds,entitymanagerfactory entitymanagerfactory) { jpapagingitemreader<manager> jpareader = new jpapagingitemreader<>(); jpareader.setentitymanagerfactory(entitymanagerfactory); jpareader.setquerystring("select m from manager m"); jpareader.setpagesize(5000); return jpareader; } @bean("managerspinvokestep") public step indvinvoiceconsctlspinvokestep(@qualifier("managerpendingreader") itemreader<manager> reader, @qualifier("managerstatuswritter") itemwriter<manager> writer, @qualifier("managerpendingprocessor") itemprocessor<manager, manager> processor,jobrepository jobrepository, platformtransactionmanager transactionmanager,batchjobstepexecutionlistner batchjobstepexecutionlistner,taskexecutor simpletaskexecutor) { return new stepbuilder("managerspinvokestep",jobrepository) .<manager, manager>chunk(5000,transactionmanager).reader(reader) .processor(processor).writer(writer) .listener(batchjobstepexecutionlistner) .taskexecutor(simpletaskexecutor) .build(); } @bean("managerspjob") public job managerspjob(@qualifier("managerspinvokestep") step indvinvoiceconsctlspinvokestep,jobrepository jobrepository,batchjobexecutionlistener batchjobexecutionlistener) { return new jobbuilder("managerspjob",jobrepository) .incrementer(new runidincrementer()) .listener(batchjobexecutionlistener) .start(indvinvoiceconsctlspinvokestep) .build(); } }
batchjobmanager.java
@service public class batchjobmanager { @autowired applicationcontext context; @autowired batchexecutorservice batchexecutorservice; @autowired batchjobrunner batchjobrunner; public void startjob() { try { system.out.println("batchjobmanager called .. "+new date()); string[] invoicenames={"employeespjob","managerspjob"}; list<string> invoicenameslist = arrays.aslist(invoicenames); launchasyn(getbatchjoblist(invoicenameslist)); } catch (exception e) { system.out.println("while loading job.."); e.printstacktrace(); } } public list<batchjob> getbatchjoblist(list<string> jobnames) throws exception{ list<batchjob> batchjoblist=new arraylist<batchjob>(); for(string job:jobnames) { batchjob batchjob= batchjob.builder().jobname(invoicejob).build(); batchjoblist.add(batchjob); } return batchjoblist; } public void launchasyn( list<batchjob> batchjoblist) throws exception{ list<completablefuture<batchjob>> batchjobfuturelist = new arraylist<completablefuture<batchjob>>(); for(batchjob batchjob:batchjoblist) { completablefuture<batchjob> jobfuture = batchexecutorservice.execute(batchjob, asynctaskexecutor); batchjobfuturelist.add(jobfuture); } completablefuture<void> jobfutureresult = completablefuture .allof(batchjobfuturelist.toarray(new completablefuture[batchjobfuturelist.size()])); completablefuture<list<canbatchjob>> allcompletablefuture = jobfutureresult.thenapply(future -> { return batchjobfuturelist.stream().map(completablefuture -> completablefuture.join()) .collect(collectors.tolist()); }); list<batchjob> resultfuturelist=allcompletablefuture.get(); for(batchjob batch:resultfuturelist) { system.out.println("status "+batch.getiscompleted()); } } }
batchexecutorservice.java
@service public class batchexecutorservice { @autowired batchjobrunner batchjobrunner; public completablefuture<canbatchjob> execute(canbatchjob canbatchjob,taskexecutor threadpooltaskexecutor){ return completablefuture.supplyasync(() -> batchjobrunner.execute(canbatchjob),threadpooltaskexecutor); } }
batchjobrunner.java
@service public class batchjobrunner { @autowired applicationcontext context; @autowired @qualifier("joblauncherasync") joblauncher joblauncherasync; /* * @autowired joblauncher joblauncherasync; */ public batchjob execute(batchjob batchjob) { try { system.out.println(" batchjob"+batchjob.getjobname()+" called ..."); joblauncherasync.run(getjob(batchjob.getjobname()), getjobparameters(batchjob.getjobname())); thread.sleep(15000); batchjob.setiscompleted(true); system.out.println(" batchjob"+batchjob.getjobname()+" completed ..."); } catch(exception e) { system.out.println("exception "+e.getmessage()); batchjob.seterrordesc(e.getmessage().tostring()); e.printstacktrace(); } return canbatchjob; } public job getjob(string jobname) { return (job) context.getbean(jobname); } public jobparameters getjobparameters(string jobname) { jobparameters jobparameters = new jobparametersbuilder() .addstring("unique_id", uuid.randomuuid().tostring(), true) .addstring("job_name", jobname, true) .adddate("execution_start_date", date.from(instant.now()), true).tojobparameters(); return jobparameters; } }
batchjob.java
public class BatchJob { private String jobName; private Boolean isCompleted; private String errorDesc; }
Jobs werden erfolgreich ausgeführt, wenn sie einzeln oder nacheinander ausgeführt werden. Bei der Verwendung von completablefuture stieß ich jedoch auf ein Problem. Ist es der richtige Weg, Spring-Batch-Jobs gleichzeitig zu starten?
Lösung
1. Fügen Sie die folgenden Eigenschaften zu application.properties hinzu
spring.main.allow-bean-definition-overriding=true
2. Joblauncher() aktualisiert, wie unten in der Datei „batchconfig.java“ gezeigt
@bean("joblauncher") public joblauncher joblauncher(datasource datasource, jobrepository jobrepository) throws exception { taskexecutorjoblauncher joblauncher = new taskexecutorjoblauncher(); joblauncher.setjobrepository(jobrepository); joblauncher.settaskexecutor(simpletaskexecutor()); joblauncher.afterpropertiesset(); return joblauncher; }
Completablefuture entfernt.
Batchexecutorservice.java gelöscht
Die folgenden Methoden wurden in „batchjobmanager.java“ hinzugefügt, um Jobs aufzurufen.
public void launchSync(List<BatchJob> batchJobList) throws Exception { for(BatchJob batchJob:batchJobList) { batchJobRunner.execute(batchJob); } }
Nach dem Login kopierenDas obige ist der detaillierte Inhalt vonBeim Versuch, zwei oder mehr Spring Batch-Jobs gleichzeitig zu starten, wird ein Fehler ausgegeben: ORA-08177: Der Zugriff für diese Transaktion konnte nicht serialisiert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

RedmiNote13RPro ist ein neues Modell mit sehr guter Leistung und Konfiguration. Dieses Telefon verfügt über eine sehr nützliche Funktion zum Ausblenden von Fotoalben. Als Nächstes erklärt Ihnen der Herausgeber, wie Sie das Fotoalbum auf dem Redmi Note13R Pro ausblenden können, um Ihre Privatsphäre zu schützen. Wie verstecke ich ein Fotoalbum auf dem Redmi Note13RPro? 1. Geben Sie die Einstellungen Ihres Xiaomi-Telefons ein. 2. Klicken Sie dann auf Datenschutz und Schutz. 3. Klicken Sie hier erneut auf „Privatsphäre schützen“. 4. Klicken Sie auf den Safe. 5. Abschließend können Sie hier ein privates Fotoalbum einrichten. Häufig gestellte Fragen: Bluetooth verbinden, Eingabemethoden-Thema ändern, Werkseinstellungen ändern, Anwendungen ausblenden, TV spiegeln, NFC, Dual-SIM-Installation aktivieren, Aktivierungszeit

Ändern Sie nicht die Bedeutung des ursprünglichen Inhalts, optimieren Sie den Inhalt, schreiben Sie ihn nicht weiter. Redmi Note13RPro bietet nicht nur eine hervorragende Leistung, sondern auch ein noch besseres Benutzererlebnis Das Redmi Note13RPro ist mit einer komfortablen Benutzererfahrung ausgestattet und verfügt über eine Schriftartenanpassungsfunktion, mit der Benutzer Schriftarten für Ihr Telefon anpassen können. Wenn Sie wissen möchten, wie Sie die Schriftgröße des Redmi Note13R Pro anpassen können, dann werfen Sie einen Blick darauf. Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? 1. Öffnen Sie die Einstellungen-App. 2. Scrollen Sie nach unten und wählen Sie „Anzeige“. 3. Klicken Sie auf „Textgröße“. 4. Auf diesem Bildschirm können Sie die Schriftgröße anpassen, indem Sie den Schieberegler ziehen oder eine voreingestellte Schriftgröße auswählen. 5. Nachdem die Anpassung abgeschlossen ist, drücken Sie zum Speichern auf „OK“.

Das Verkaufsvolumen des Redmi Note13R Pro ist seit seiner Einführung auf einem hohen Niveau geblieben. Als neues Modell von Redmi sind viele nützliche Funktionen integriert, beispielsweise die dynamische Hintergrundeinstellungsfunktion. Hier präsentiert Ihnen der Herausgeber heute ein detailliertes Tutorial zum Festlegen eines dynamischen Hintergrundbilds auf dem Redmi Note13R Pro. Wenn Sie es wissen möchten, werfen Sie einen Blick darauf. Wie stelle ich ein dynamisches Hintergrundbild auf dem Redmi Note13RPro ein? Suchen und öffnen Sie die App „Personalisiertes Design“ oder „Design“ auf dem Desktop Ihres Telefons. Suchen Sie in der App nach der Option „Hintergrund“ oder „Live-Hintergrund“ und klicken Sie zum Aufrufen. Suchen Sie auf der Seite „Live-Hintergründe“ nach dem gewünschten Live-Hintergrund und wählen Sie ihn aus. Klicken Sie auf das ausgewählte Live-Hintergrundbild, um eine Vorschau anzuzeigen, und wählen Sie dann die Option „Herunterladen“, um es herunterzuladen. Suchen Sie nach Abschluss des Downloads nach „

Das Mobiltelefon Redmi Note13RPro erfreut sich in letzter Zeit großer Beliebtheit. Viele Benutzer verwenden dieses Mobiltelefon jedoch zum ersten Mal und wissen daher nicht, wie sie das Redmi Note13RPro an den Computer anschließen sollen In diesem Zusammenhang ist der Herausgeber hier, um Ihnen eine ausführliche Tutorial-Einführung zu erklären. Wie verbinde ich das Redmi Note13RPro mit dem Computer? 1. Verbinden Sie das Redmi-Telefon über ein USB-Datenkabel mit der USB-Schnittstelle des Computers. 2. Öffnen Sie die Telefoneinstellungen, klicken Sie auf Optionen und aktivieren Sie das USB-Debugging. 3. Öffnen Sie den Geräte-Manager auf Ihrem Computer und suchen Sie die Option für mobile Geräte. 4. Klicken Sie mit der rechten Maustaste auf das Mobilgerät, wählen Sie „Treiber aktualisieren“ und dann „Automatisch nach aktualisierten Treibern suchen“. 5. Wenn der Computer nicht automatisch nach dem Treiber sucht,

Das Mobiltelefon Redmi Note13RPro integriert eine Reihe intelligenter Tools in Bezug auf Softwarefunktionen. Eines davon ist das schnelle und genaue Extrahieren von Textinhalten aus Bildern. Der folgende Editor stellt Ihnen vor, wie Redmi Note13RPro Text aus Bildern extrahiert. Wie extrahiere ich Text aus Bildern auf dem Redmi Note13RPro? Verwenden Sie die QR-Code-Scanfunktion von Xiaomi, öffnen Sie die QR-Code-Scananwendung auf Ihrem Telefon, klicken Sie auf das Bildsymbol, wählen Sie ein Bild aus und klicken Sie dann rechts auf die Option „Text erkennen“, um den Text im Bild erfolgreich zu extrahieren. Bedienung über das Handyalbum. Suchen Sie im Handyalbum nach dem Bild, dessen Text extrahiert werden soll, klicken Sie unter dem Bild auf „Mehr“ und wählen Sie „Text extrahieren“. Nach erfolgreicher Erkennung können Sie den Text nach Bedarf kopieren oder speichern. Verwenden Sie WeChat-Miniprogramme. Mikro öffnen

Um Benutzern ein besseres Benutzererlebnis zu bieten, bietet Ihnen Redmi Note13R Pro die Funktion zum Anpassen der Schriftgröße. Mit dieser Funktion können Sie die Schriftgröße des Mobiltelefons an Ihre Bedürfnisse anpassen. Als nächstes stellt der Herausgeber detailliert vor, wie man die Schriftart auf dem Redmi Note13R Pro anpasst. Lassen Sie uns gemeinsam lernen. Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? 1. Öffnen Sie die Telefoneinstellungen und klicken Sie auf „Anzeige“. 2. Klicken Sie auf „Schriftarteinstellungen“. 3. Wählen Sie die Schriftgröße aus, die Sie einstellen möchten. Häufig gestellte Fragen. Bluetooth verbinden. Eingabemethode ändern. Design. Werkseinstellungen ändern. Anwendungen ausblenden. Mirror TV. NFC. Dual-SIM-Installation aktivieren. Aktivierungszeit. Was ist mit Redmi Note13RPro Schriftgröße anpassen? Dieses Tutorial ist eigentlich relativ einfach, mit Ausnahme des im Artikel erwähnten RedmiN

Die Kamerafunktion des Redmi Note13RPro ist sehr einfach zu bedienen, insbesondere beim Aufnehmen von Bildern simuliert sie das Geräusch des Kameraverschlusses. In ruhigen Situationen wie Bibliotheken kann diese Funktion jedoch andere stören, daher möchten viele Benutzer wissen, wie man sich dreht Lassen Sie sich vom Redakteur unten den Kameraton des Redmi Note13RPro ausschalten. Wie schalte ich den Kameraton beim Redmi Note13RPro aus? 1. Bei der ersten Methode müssen Sie zunächst die Einstellungen Ihres Telefons öffnen. 2. Suchen Sie dann im Einstellungsmenü nach Systemanwendungen. 3. Als nächstes finden wir die Kameraoption unter der Systemanwendungsoberfläche. 4. Schließlich können wir in der Kameraschnittstelle festlegen, ob der Kameraton ausgeschaltet werden soll. Wir müssen nur den Schalter auf der rechten Seite des Kameratons ausschalten. 5. Die zweite Methode, der erste Schritt, öffnen

Entire Huoba ist ein sehr unterhaltsames Gelegenheits-Puzzlespiel, das jeder auf mehreren Plattformen erleben kann! Das Spiel bietet unzählige spannende Level, die darauf warten, freigeschaltet zu werden. Jedes Level ist voller Neuheiten und Herausforderungen und ermöglicht es Ihnen, ein interessantes Abenteuer zu erleben, bei dem Sie Fragen beantworten und neue Spielinhalte freischalten. Wie kann man also das gesamte Level von Huoba abschließen? Heute bringe ich Ihnen einen vollständigen Leitfaden für alle Level von „Whole Life“. Wenn Sie beim Bestehen des Levels auf Probleme stoßen, können Sie darauf zurückgreifen! „Das ganze Leben“: Vollständiger Leitfaden für alle Ebenen von „Das ganze Leben“. Der vollständige Leitfaden für alle Ebenen von „Das ganze Leben“. Helfen Sie ihr, sich den Silvesterabend anzuschauen, helfen Sie der kleinen Schwester, den Dreckswolf zu identifizieren, und der Großmutter Um dem kleinen Mädchen zu helfen, aus der Gefahr zu kommen, gibt das Outdoor-Abenteuer vor, Ah Piao nicht zu sehen, und verwandelt sich wieder in einen Humanoiden. Jemand auf dem Rücksitz blieb ruhig und kümmerte sich um den weiblichen Geist ruhig und ging mit dem weiblichen Geist um.