PDA

View Full Version : Ausführung von SQL-Statements sehr langsam



BurgerKing
04-05-07, 16:23
Hallo,

ich bin ziemlich neu beim Thema Java. Jetzt habe ich mir eine kleine Testanwendung gebaut, bei der eine Maske mit verschiedenen Eingabefeldern ausgegeben wird. Bei einigen dieser Felder dürfen nur Werte eingegeben werden, bei denen ein entsprechender Satz in einer Tabelle auf der AS/400 vorhanden sein muss. Beispiel: Die Maske enthält ein Feld "Benutzer". Jetzt soll in diesem Feld nur ein Benutzer eingetragen werden dürfen, der auf der AS/400 in der Tabelle USRPF hinterlegt ist. Wenn jetzt also auf den OK Button geklickt wird, dann wird eine Methode aufgerufen, die die eingegebenen Werte auf Gültigkeit überprüft. Das Problem ist jetzt die grausame Performance, mit dem das Ganze abläuft. Hier mal ein Beispiel, wie ich solch eine Prüfung mache.



found = false;
select = null;
rs = null;
try {
select = jdbcConnection.createStatement();
rs = select.executeQuery("SELECT COUNT(*) FROM USRLF01 WHERE USR='" +
textOwner.getText() + "'");
if (rs.next() && rs.getLong(1) != 0) {
found = true;
}
}
catch (SQLException e) {
}
if (rs != null) {
try {
rs.close();
}
catch (SQLException e1) {
}
}
if (select != null) {
try {
select.close();
}
catch (SQLException e1) {
}
}
if (!found) {
setErrorMessage("The value in field 'User' is not valid.");
textOwner.setFocus();
return false;
}


Von diesen Prüfungen habe ich in der entsprechenden Methode 15 an der Zahl. Wie kann ich das Ganze beschleunigen? Mache ich etwas grundsätzlich falsch?

BenderD
04-05-07, 19:02
Hallo,

das sollte in dieser Form, wie es ist, im Bereich von Zehntel Sekunden liegen, falls das länger dauert ist zu untersuchen, woran das liegt. Da kommen mehrere Kandidaten in Betracht; z.B.: ungeeignete Hardware, fehlende Zugriffspfade, fehlende PTFs, Ressourcen Engpässe der AS/400. Einstiegspunkt ist da bei mir meist der Database Monitor, um zu ermitteln ob das ganze von der Datenbank her kommt.
An dem Code lässt sich noch verbessern: statt Statement PreparedStatement verwenden. Bei entsprechendem Cachen der PreparedStatements (siehe auch den Thread zu ConnectionPool) macht es das auch schneller, aber Sekunden sind hier nicht zu holen.

mfg

Dieter Bender



Hallo,

ich bin ziemlich neu beim Thema Java. Jetzt habe ich mir eine kleine Testanwendung gebaut, bei der eine Maske mit verschiedenen Eingabefeldern ausgegeben wird. Bei einigen dieser Felder dürfen nur Werte eingegeben werden, bei denen ein entsprechender Satz in einer Tabelle auf der AS/400 vorhanden sein muss. Beispiel: Die Maske enthält ein Feld "Benutzer". Jetzt soll in diesem Feld nur ein Benutzer eingetragen werden dürfen, der auf der AS/400 in der Tabelle USRPF hinterlegt ist. Wenn jetzt also auf den OK Button geklickt wird, dann wird eine Methode aufgerufen, die die eingegebenen Werte auf Gültigkeit überprüft. Das Problem ist jetzt die grausame Performance, mit dem das Ganze abläuft. Hier mal ein Beispiel, wie ich solch eine Prüfung mache.



found = false;
select = null;
rs = null;
try {
select = jdbcConnection.createStatement();
rs = select.executeQuery("SELECT COUNT(*) FROM USRLF01 WHERE USR='" +
textOwner.getText() + "'");
if (rs.next() && rs.getLong(1) != 0) {
found = true;
}
}
catch (SQLException e) {
}
if (rs != null) {
try {
rs.close();
}
catch (SQLException e1) {
}
}
if (select != null) {
try {
select.close();
}
catch (SQLException e1) {
}
}
if (!found) {
setErrorMessage("The value in field 'User' is not valid.");
textOwner.setFocus();
return false;
}


Von diesen Prüfungen habe ich in der entsprechenden Methode 15 an der Zahl. Wie kann ich das Ganze beschleunigen? Mache ich etwas grundsätzlich falsch?