# Interserver was unable to complete an io request



## Guest (15. Nov 2005)

Guten Tag,

Verwende Interbase 6.5!
Ich habe einen einfachen Code:

```
stmt =  con.createStatement();      
      rs = stmt.executeQuery(select);
```

Dieser Code wird in einer Schleife beim Initialisieren oft durchlaufen! Bei etwa 8 von 10 Durchläufen erhalte ich die Exception - "Interserver was unable to complete an io request". Das veranlasst mich anzunehmen, dass der JDBC - Treiber mit der Abarbeitung des Codes nicht zu Rande kommt. Deshalb möchte ich zwischen der Statement-Zeile und der Result-Zeile ein "Wait" einbauen.

Wie geht das?

Danke


----------



## Bleiglanz (15. Nov 2005)

machst du auch rs.close() in der schleife?


----------



## Guest (15. Nov 2005)

Nein mache ich nicht. Brauche ich auch nicht - denke ich. 
Weil:


```
private void createBaum() {
    String query = null;
    for (int i = 0; i < baum.length; i++) {
      rs = null;
      query = "select baumbez from wald where baumbez = 'Eiche';
      rs = DB.abfrage(query);
      try {
        if (!rs.next()) {
          String insert = null;
          insert = "insert into wald(.....)";
          DB.eintrag(insert);
        }
      }
      catch (SQLException ex) {
        ex.printStackTrace();
      }
    }
  }

  //In der KLasse DB
  public synchronized ResultSet abfrage(String select) {
    try {
      stmt = null;
      stmt =  con.createStatement();
      rs = stmt.executeQuery(select);
    }
    catch (SQLException ex) {
      ex.printStackTrace();
    }
    return rs;
  }
```

Ich schliesse also das ResultSet nicht, aber ich setze er null.


----------



## Bleiglanz (15. Nov 2005)

na dann machs halt nicht

-> durchs nullen wird die Verbindung auf jeden Fall nicht geschlossen, reine Resourcenverschwendung


----------



## Guest (15. Nov 2005)

Kann man sehen wie man will. Ich habe ja nur dieses eine ResultSet. Das heißt, wenn ich etwas abfragen will, dann muss ich mich zwangläufig dieser einen Methode bedienen (deswegen synchronized).
Das war aber nicht meine Frage.

Meine Frage war, ob und wie ich eine Art temporären Stop einbauen kann.


----------



## Bleiglanz (15. Nov 2005)

stmt.executeQuery(select)

erzeugt jedesmal ein neues, das nicht geschlossen wird

(das synchronized ist witzlos, wenn du nur einen Thread hast)



http://www.java-forum.org/de/viewtopic.php?t=15989


----------



## Guest (15. Nov 2005)

nein!
ich denke ich überschreibe das Statement - Objekt. Immerhin habe ich die Variable stmt als KLassenvariable angelegt. Daher meine ich, dass bei jedem Aufruf von stmt..... das alte Objekt kurzer Hand überschrieben wird.

Das synchronized ist gar nicht so witzlos. Ob es schlau ist oder nicht, so verwende ich die Methode Abfrage von mehreren Threads aus als einzige, sobald ich auf die DB zugreifen muss.

Eine Connection mache ich auch nur eine einzige auf, die zur geamten Laufzeit geöffnet bleibt. Es ist nicht möglich aufgrund der Geschwindigkeit des JDBC Treibers jede Abfrage und jeden Eintrag zu öffenen und zu schliessen.

Ich versuche nur das bestmögliche aus dem mir gegebenen herauszuholen und ich denke der eingeschlagene Weg ist wahrscheinlich nicht der feinste aber auf jeden Fall der einzig machbare.


----------



## Bleiglanz (15. Nov 2005)

Connection global ist OK

aber ein ResultSet musst du closen sobald du es nicht mehr brauchst, da führt kein weg dran vorbei


----------



## Guest (15. Nov 2005)

Glaub ich nicht.

Das ResultSet, dass ich in der Methode abfrage anlege wird ohnehin immer überschrieben. Und in der Methode wo ich das ResultSet hin (natürlich wieder auf ein ResultSet) übergebe kann ich es closen - da geb ich dir recht. Habe ich auch schon gemacht. Nur bekomme ich die Exception trotzdem nicht weg, womit ich wieder am Anfang meiner Frage wäre.


----------

