2012-04-09 16 views
6

Ich habe ein Leistungsproblem mit Aufruf von getInt in einem ResultSetExtractor. GetInt wird 20000 mal aufgerufen. Ein Anruf kostet 0,15 ms, die Gesamtkosten betragen 24 Sekunden, während er innerhalb des Profilers läuft. Die Ausführung der SQL-Anweisungen dauert ca. 8 Sekunden (Zugriff über den Primärschlüssel). Ich benutze die mysql Treiber Version 5.1.13, mysql Server 5.1.44 und spring-jdbc-3.1.1 Haben Sie eine Idee, um die Leistung zu verbessern?Leistungsproblem mit getInt in ResultSetExtractor

mut.getMutEffect()[0]=(rs.getInt("leffect_a") != 0); 
    mut.getMutEffect()[1]=(rs.getInt("leffect_c") != 0); 
    ... 
    mut.getMutEffect()[19]=(rs.getInt("leffect_y") != 0); 
    mut.getMutReliability()[0]=rs.getInt("lreliability_a"); 
    ... 
    mut.getMutReliability()[19]=rs.getInt("lreliability_y"); 

Mein Programm sieht wie folgt aus

CREATE TABLE mutation (
... 
leffect_a BIT NOT NULL, 
lreliability_a TINYINT UNSIGNED NOT NULL, 
... 
leffect_y BIT NOT NULL, 
lreliability_y TINYINT UNSIGNED NOT NULL, 
... 
) ENGINE=MyISAM; 

Edit: Innerhalb getInt Méthode getIntWithOverflowCheck genannt wird, die teuer zu sein scheint. Ist es möglich, diese Kontrollen abzuwenden?

Antwort

2

Hier sind einige Vorschläge:

  • Set holen Größe auf eine ziemlich große Anzahl: Statement.setFetchSize(). Dies sollte die Anzahl der Roundtrips zum Datenbankserver reduzieren, während das Resultset verarbeitet wird.

  • Sicherstellen, dass die Select-Anweisung ist optimal durch Profilieren

  • Allgemeine Tabellenoptimierung, z verwendest du korrekte Datentypen? Es sieht so aus, als könnten Sie leffect_a in einen BOOLEAN ändern

  • Stellen Sie sicher, dass Sie keine unnötigen Spalten in Ihrer SELECT-Anweisung zurückgeben.

  • Verwenden PreparedStatement

  • Vermeiden scrollbaren und aktualisierbare Resultsets (weder sind die Standardeinstellung)

+0

Statement.setFetchSize() hat gut funktioniert. Danke vielmals. –

0

Zwei Vorschläge:

  1. Shop das Ergebnis getMutEffect() und getMutReliability() in lokalen Variablen, wie sie immer wieder verwendet werden. Der Hotspot Jit könnte inline und entfernt die doppelten Ausdrücke, aber ich denke, es ist klarer, sich nicht darauf zu verlassen.
  2. Es kann schneller sein, die Werte des ResultSet mit ihren Indizes anstelle der Spaltennamen abzurufen. Sie könnten sogar eine lokale Karte von Namen zum Indexieren erstellen, was für einige jdbc-Treiber merkwürdiger ist, als wenn ResultSet das Mapping durchführen würde.
+0

Danke für die Antwort. Der Profiler zeigt, dass es billig ist, den Spaltennamen dem Index zuzuordnen. Und es gibt auch kein Performance-Problem beim Zugriff auf getMutEffect. –