Liste schneller durchsuchen

  • Themenstarter Themenstarter Gelöschtes Mitglied 68249
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 68249

Gast
Hi, ich habe aktuell ein kleines Performance-Problem. Bin aber auch bereit komplett andere Ansätze zu probieren.
Folgende Methode dauert viel zu lange:
Java:
    private void setAbfragenList() {
        List<String> refAbfragen = new ArrayList<>();
        for (ResponseTime rt : responseTimes) {
            ResponseTimeQuery query = rt.getQuery();
            if (query == null) {
                continue;
            }
            if (!refAbfragen.contains(query.getName())) {
                refAbfragen.add(query.getName());
            }
        }
    }
Ich habe eine Liste von Datenbankobjekten responseTimes. In der sind 18500 Datensätze. Diese haben (eigentlich) alle eine ResponseTimeQuery query, was wiederum auch eine Datenbankentität ist. Das erstellen meine Liste von Strings dauert aktuell 318 Sekunden. Ich denke das Hauptproblem ist das Holen des Namens der Suche, weil er schätzungsweise dafür jedes Mal eine Datenbankverbindung aufbaut.

Ich habe schon über Streaming nachgedacht, ob man damit evtl. erst alle unique ResponseTimeQuery query aus der Liste holt und dann nur noch die Namen in einer Liste collecten lässt, damit er evtl. nicht über eine DB-Verbindung geht, sondern diese nur für die letztendlich 4 -5 Werte in der Liste aufbaut.
Allerdings versuche ich mich gerade mehr ins Streaming zu fuchsen, aber ich finde keine Seite, die es mal so richtig schön erklärt. Aktuell bin ich froh darum, wenn ich eine Zeile Code erzeuge, die funktioniert und mir IntelliJ im Anschluss sagt, dass man das aber noch schöner machen könnte.

Letztendlich befülle ich mit der Liste ein Dropdownfeld in einer Primefaces 14 Tabelle als Filter für die Spalte. Also, falls es dafür eine bessere vielleicht eingebaute Möglichkeit gäbe, wäre ich natürlich auch dankbar.
 
Also wenn ich das richtig verstehe, dann willst Du in refAbfragen alle getName() haben ohne doppelte Einträge.

Dann wäre denkbar, dies einfach per Set zu machen.

Andere Möglichkeiten zur Optimierung:
a) ggf. eine bessere Abfrage, die das direkt aus der Datenbank zieht statt über ganz viele einzelne Abfragen.
b) Statt einem Set könnten auch andere Datentype interessant sein. Hier ist aber die Frage, was Du mit den Daten später noch machen willst.
 
Also, ja, du verstehst es richtig.
a) meinst du quasi dieselbe Abfrage, die ich zur Erzeugung der eigentlichen Liste verwende, nur mit nur einem Ergebnisfeld und das dann mit Distinct?
b) Ich brauche die Liste als Filter auf eine Tabelle im Frontend:
 
Dann versuch evtl. erst einmal, ob es schon ausreicht das zu ändern auf:
Set<String> refAbfragen = new HashSet<>();
 
Ich hab es jetzt ganz anders gelöst und bin auf 21ms runter:
Ich frage die komplette Tabelle ResponseTimeQuery ab, da sind aktuell fünf Datensätze drin und packe die in die Liste. Wenn jemand tatsächlich eine Zeile auswählen sollte, die im Ergebnis nicht enthalten ist, dann bekommt er eben 0 Ergebnisse. Ich denke, da überwiegt der Geschwindigkeitsvorteil.
Ärgerlich ist, dass ich für die Tabellendaten eine schnellere Abfrage gefunden habe, aber mit der Abfrage kann man die Tabelle an den ENUMs nicht mehr filtern.
Bin noch am überlegen, ob ich das hier nochmal zur Prüfung rein gebe, oder direkt bei Primefaces eine Prüfung starte, siehr für mich nämlich nach einem Bug aus, wenn die Tabelle mit dem einen Datenset filterbar ist und mit einem anderen auf Fehler läuft.
 

Zurück
Oben