Inhaltsverzeichnis
Frageninhalt
Lösung
Heim Java 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

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

Feb 09, 2024 pm 05:00 PM
lsp

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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();
    }
Nach dem Login kopieren

}

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();
    }

}
Nach dem Login kopieren

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();
    }
    
}
Nach dem Login kopieren

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());
          }
    }
   
    
}
Nach dem Login kopieren

batchexecutorservice.java

@service
public class batchexecutorservice {
    
        
    @autowired 
    batchjobrunner batchjobrunner;
        
    public completablefuture<canbatchjob> execute(canbatchjob canbatchjob,taskexecutor threadpooltaskexecutor){
        return completablefuture.supplyasync(() -> batchjobrunner.execute(canbatchjob),threadpooltaskexecutor);
    }
    
    
}
Nach dem Login kopieren

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;
    }
    
}
Nach dem Login kopieren

batchjob.java

public class BatchJob {

    private String jobName;
    private Boolean isCompleted;
    private String errorDesc;
    
    
}
Nach dem Login kopieren

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;
    }
Nach dem Login kopieren
  • 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 kopieren

    Das 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!

  • Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Wie man Teamkollegen wiederbelebt
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Wie verstecke ich ein Fotoalbum auf dem Redmi Note13RPro? Wie verstecke ich ein Fotoalbum auf dem Redmi Note13RPro? May 01, 2024 pm 12:50 PM

    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

    Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? May 07, 2024 pm 06:34 PM

    Ä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“.

    Wie stelle ich ein dynamisches Hintergrundbild auf dem Redmi Note13RPro ein? Wie stelle ich ein dynamisches Hintergrundbild auf dem Redmi Note13RPro ein? Apr 28, 2024 pm 06:49 PM

    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 „

    Wie verbinde ich das Redmi Note13RPro mit dem Computer? Wie verbinde ich das Redmi Note13RPro mit dem Computer? May 09, 2024 pm 06:52 PM

    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,

    Wie extrahiere ich Text aus Bildern auf dem Redmi Note13RPro? Wie extrahiere ich Text aus Bildern auf dem Redmi Note13RPro? May 08, 2024 pm 10:00 PM

    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

    Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? Wie passt man die Schriftgröße auf dem Redmi Note13RPro an? Apr 29, 2024 pm 07:22 PM

    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

    Wie schalte ich den Kameraton beim Redmi Note13RPro aus? Wie schalte ich den Kameraton beim Redmi Note13RPro aus? May 02, 2024 pm 06:31 PM

    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

    Ein vollständiger Leitfaden für alle Ebenen von „Whole Life' Ein vollständiger Leitfaden für alle Ebenen von „Whole Life' May 07, 2024 pm 06:31 PM

    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.