Asynchrones Nachladen in eine Liste

DaBe1812

Bekanntes Mitglied
Hi,
ich soll in unserem Migrationsprojekt jetzt für die Übergangszeit eine Übergangs-Krücke einbauen.
Der Prozess läuft aktuell folgendermaßen ab:
Ich suche mit einer NativeQuery im Altsystem meine Daten zusammen und strukturiere diese schon in die Form der neuen Datenbank, bzw. einigermaßen in die Form der neuen Objekte.
Dann übergebe ich diese List<Object[]> an einen Migrationshandler, welcher dann Feld für Feld aus dem ObjectArray die Werte holt, diese bei Bedarf in das Format des neuen Objekts bringt und dann per Setter in das Objekt schreibt.
Aus Performancegründen persistieren wir aktuell auch nicht mehr, weil die Objekte sowieso nicht in der neuen Datenbank gepflegt werden.

Eine relativ große Suche dauert für Schritt 1 ca. 11 Sekunden und liefert etwas um die 23.000 Datensätze. Flaschenhals ist dann die Migration, hier kann man pro Satz knapp unter einer Sekunde rechnen, weswegen ich das aktuell einfach auf X-Datensätze begrenze.

Jetzt war die Idee die Migration Paketweise zu machen. Also ich habe die komplette Liste mit den ObjektArrays aus der Suche und migriere 25 Sätze davon. Das entspricht im Frontend einer Seite der Tabelle. Dann muss ich das Frontend aktualisieren. Danach werden die nächsten 25 Ergebnisse in die Liste geschrieben und das Frontend wieder aktualisiert, usw.

Nur ich weiß nicht, wie ich das machen soll. Frontend ist aktuell Primefaces 13.
Der Frontend-Handler sieht aktuell auszugsweise so aus:
Java:
@Named
@ViewScoped
public class ProIpsSearchHandler implements Serializable {
    private List<SearchableEntity> searchResults;
    public void search() {
        List<SearchTerm> searchTerms = new ArrayList<>();
        searchTerms.add(new SearchTerm(selectedSearchfield1, selectedSearchOperator1, searchString1, selectedSearchState1));
        searchResults = selectedInterface.searchEntity(searchTerms, 500);
}

Und die Suchfunktion so:
Java:
@ApplicationScoped
public class OldWindowsOsFactory implements Serializable {
    public List<SearchableEntity> searchEntity(List<SearchTerm> searchTerms, Integer maxRecordsAllowed) {

        StringBuilder searchTermAddition = new StringBuilder();
        
        for(SearchTerm term : searchTerms) {
            //Suchbedingung zusammenbauen
        }
        
        String sql = MigSelectSql.SELECT_WINDOWS_OS.replace("%%SEARCH_TERM_ADDITION%%", searchTermAddition.toString());
        Query query = em.createNativeQuery(sql);
        List<Object[]> results = query.getResultList();
        
        if(results.size() > maxRecordsAllowed) {
            results = results.subList(0, maxRecordsAllowed);
        }
        
        List<WindowsOsData> windowsOsList = new ArrayList<>();
        
        try {
            windowsOsList = migWindowsOs.migrateList(results, false);
        } catch(Exception e) {
            LOG.error("Fehler beim holen alter Daten", e);
        }
        
        return new ArrayList<>(windowsOsList);
    }
}

Also theoretisch muss ich OldWindowsOsFactory Runnable implementieren lassen?
Und dann muss die search() im Frontend permanent prüfen, ob die Suche (Migration) fertig ist und alle x Prüfeinheiten könnte sie sich neue Werte holen, oder?
Oder kann ich aus einer Runnable auch pushen, dass es Werte gibt?
Aber das alles aktualisiert mir ja nicht automatisch das Frontend?
 

Oneixee5

Top Contributor
Eine relativ große Suche dauert für Schritt 1 ca. 11 Sekunden und liefert etwas um die 23.000 Datensätze. Flaschenhals ist dann die Migration, hier kann man pro Satz knapp unter einer Sekunde rechnen, weswegen ich das aktuell einfach auf X-Datensätze begrenze.
Was ist dass denn für eine Hardware? Vermutlich eine Dampfmaschine! Aber mal ernsthaft da stimmt was nicht mit der Abfrage: 11 Sekunden für die winzige Datenmenge, dass geht nicht, auch nicht bei 1000 Spalten. Ich würde als erstes die Abfrage auf ein kartesisches Produkt prüfen.
 

DaBe1812

Bekanntes Mitglied
Aber mal ernsthaft da stimmt was nicht mit der Abfrage: 11 Sekunden für die winzige Datenmenge, dass geht nicht, auch nicht bei 1000 Spalten
Die Diskussion möchte ich nicht mehr auf machen, es sind fünf Spalten in der Tabelle und die Datensätze sind vertikal mit einem Index über drei Spalten. Das Select besteht aus 26 left joins und die Datenbank ist einfach Schrott. Hauptgrund für den Umzug in ein ordentliches relationales Datenmodell.


Ließt sich ganz sinnvoll. Muss ich morgen mal ausprobieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Asynchrones Servlet löst NullPointerException aus Allgemeines EE 5
B Java mail API - möchte nur eine gewisse Anzahl von Emails in die Liste holen Allgemeines EE 3
B eine vom Admin hochgeladene csv -Datei in der Datatable auch von jedem User sichtbar Allgemeines EE 0
OnDemand Programm starten, wenn eine Aufgabe erledigt Allgemeines EE 1
X Konsolenausgabe einer java klasse in eine jsp umleiten Allgemeines EE 7
T Wie kann ich eine große Datenmenge vorhalten, damit ich seitens Frontend darauf zugreifen kann? Allgemeines EE 17
R Wie eine stateful session bean erneut "aufgreifen" Allgemeines EE 22
D JSF h:panelgrid - eine reihe mit zusätzlicher spalte Allgemeines EE 6
S Wie am besten eine Authentifzierung einbauen? Allgemeines EE 7
B Problem beim einbinden einer CSS in eine JSP Allgemeines EE 8
slawaweis CMS Unterbau für eine Web 2.0 Anwendung Allgemeines EE 4
M Wie erhällt eine MessageDrivenBean Nachrichten aus einer Queue ? Wer Pollt da gegen die DB? Allgemeines EE 3
MQue include einer jsp in eine andere Allgemeines EE 4
D Wann genau eine Middleware Allgemeines EE 8
2 JSTL Tags für eine Bean? Allgemeines EE 4
S Session in eine andere Anwendung übergeben Allgemeines EE 2
D Frage zum Verlassen eine JSF-Eingabefeldes Allgemeines EE 6
S Struts: zwei JSP's nutzen eine Action Allgemeines EE 5
J Rechnername auf dem eine J2EE läuft Allgemeines EE 10
P Eine Frage zum Thema Applikationsaufbau Allgemeines EE 3
H Eine Datenbank - 1 Datenmodell - 2 Anwendungsumgebungen Allgemeines EE 2
E HTTP-GET// -->Eine URL aufrufen, aber nicht dahin navigie Allgemeines EE 2
H Eine kurze Verständnisfrage zum Tomcat Allgemeines EE 2
W Eine Form an einen fremden Server schicken. Allgemeines EE 3
G WebApp (mit Tomcat) Wie kann meine Klasse eine Datei laden? Allgemeines EE 7
E Eine Art Thread.sleep() in JSTL? Allgemeines EE 4
M wie sieht eine ejb-jar.xml aus ? Allgemeines EE 8
T eine web anwendung bereitstellen ? Allgemeines EE 5
N Einbindung einer Bean in eine JSP (Tomcat-Server 5.5.x) Allgemeines EE 2
G StackTrace in eine TEXTAREA bringen Allgemeines EE 4
W Woraus baut man eine Super-Business-Anwendung? Allgemeines EE 5
B Besondere Ländereinstellungen für eine TomcatApp Allgemeines EE 2
TRunKX Werteübergabe von einer *.jsp in eine *.java ohne struts Allgemeines EE 4
G Application Server! Gibt es eine grundsätzliche Architektur? Allgemeines EE 9
B EJB --- Eine Modeerscheinung? Allgemeines EE 14
X Mit JSP eine Datenbankabfrage durch führen. Allgemeines EE 13
Y Eine neue Seite mit Servlet öfnnen Allgemeines EE 9
A mit JavaMail eine html mail versenden? Allgemeines EE 4

Ähnliche Java Themen

Neue Themen


Oben