Problem mit zuvielen anfragen

Hi,

ich bin relativ neu in Sachen Datenbankprogrammierung und habe folgendes Problem: ich will von einer SQL-Datenbank einen grösseren Datensatz (~760 Rows) per java in eine andere datenbank importierten. ich habe jetzt eine schleife von 1 bis zur maximalen reihe gemacht abre nach dem import von ca 20 reihen hört er auf. kann es sein das innerhalb einer connection nur eine bestimmte anzahl anfragen zulaessig ist? bringt es etwas die connection bei jeder zeile zu erneuern? danke schonmal.

rene

Hi,

bringt es etwas die connection bei jeder zeile zu erneuern?

Generell: nein.
Aber es könnte sein, daß Deine Schleife ein wenig ungeschickt mit den Resourcen umgeht. Hier könnte es helfen, wenn Du den Codeteil hier reinposten würdest. Bitte mit PRE-Tag!

Gruß

J.

Allgemeiner Tipp zur Problemstellung, wenn du viele Statements hintereinander absetzen möchtest (ich nehme an du machst für jede Row ein Insert), dann solltest du den Batch-Modus dafür verwenden.

Dabei werden zuerst alle Statements gesammelt, und dann alle zusammen auf einmal an die Datenbank übergeben und ausgeführt. Spart ziemlich viel Zeit, da ein großer Teil des Ausführens eines Statements für die Kommunikation zwischen Anwendung und Datenbank draufgeht.

Nähere Infos dazu findest du unter:

http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstar…

Grüße, Robert

Hi,

rene

Hast du deine Statements und Reslutsets nach der Abarbeitung geschlossen? Wenn du als Fehlermeldung „too many open cursors“ bekommst ist das meistens die Ursache.
Bei mehreren Zugriffen auf eine Tabelle solltest du immer PreparedStatements benutzten, damit bereitest du das Statement in der DB vor und sendest immer nur die Parameter:

PreparedStatement prepstmt= myConnection.prepareStatement("Insert into mytable (spalte1, spalte2, spalte3) VALUES ( ? , ? , ? ) ");

// dann pro Schleifendurchlauf
prepstmt.setString(1, loadValue1);
prepstmt.setInt(2, loadValue2);
prepstmt.setDouble(3, loadValue3);

// wobei der erste Übergabewert der index der Fragezeichens ist und „loadValue“ der einzufügende Wert sein soll

prepstmt.executeUpdate();

… und wenn die Schleife durchlaufen ist unbedingt
prepstmt.close();
aufrufen.

Das gleiche auch bei Abfragen mit veränderlichen Kriterien auf der gleichen Spalte:

PreparedStatement stmt= myConnection.prepareStatment(" Select * from myTable where spalte1 = ? and spalte2 = ? ");

stmt.setInt(1, i);
stmt.setInt(2, k);

ResultSet res= stmt.executeQuery();

while(res.next()) …

und bei jedem Schleifen durchlauf:

res.close();

und am Ende das PreparedStatement schliessen.
Die Connection jedesmal erneut herstellen kostet Zeit
und bei mehreren Clients wird die DB langsam.

Raimund

morgen!

abre nach dem import von ca 20
reihen hört er auf. kann es sein das innerhalb einer
connection nur eine bestimmte anzahl anfragen zulaessig ist?
bringt es etwas die connection bei jeder zeile zu erneuern?

wie schaut’s denn mit den größen aus?
kleine oracle erfahrung: nach einer gewissen anzahl (abhängig vom temporären-tablespace und von rollback-segmenten) ein commit absetzen, da der platz ausgeht …

grüße,
tomh