# Frage zu connection?



## Guest (17. Okt 2008)

Hallo,

ich habe eine Klasse Datenbank. Diese baut wie folgt die Verbindung auf und erstellt ein paar PreparedStatements


```
private PreparedStatement pst;
public void connect(){
   Connection con = DriverManager.getConnection(....);
   ...
   pst = con.prepareStatement("SELECT * FROM test WHERE ID=?");
}
```

Jetzt habe ich folgendes Problem. Ich starte meinen Datenbankclient. Dieser baut die Verbindung auf. Alles OK. Danach stürzt mir die Datenbank ab und ich versuche dann wie folgt auf die Connection zuzugreifen:


```
public void select(){
  try{ 
    pst.clearParameters();
    pst.setLong(1,1);
    ResultSet rs = pst.executeQuery()
  }catch(...){
     ...
  }
}
```

Daraufhin wird mir ein com.mysql.jdbc.CommunicationsException: Communications link failure geworfen.

Jetzt würde vor dem ausführen des PreparedStatements jedoch gerne prüfen ob die Verbindung zur DB in Ordnung ist und wenn nicht ein erneutes connect() versuchen. Nur wie stelle ich das an. Eine Funktion wie con.isConnectionOk() habe ich nicht gefunden.

Bin neu in Java und bräuchte den richtigen Schubs.

Danke


----------



## Amenophis (17. Okt 2008)

Och, das ist ganz einfach - so einfach, dass keine Sau darauf kommt   


```
System.out.println(con);
```

In der Konsole steht dann soetwas (Falls du per JdbcOdbc darauf zugreifts):


```
sun.jdbc.odbc.JdbcOdbcConnection@179953c
```

Das nach dem @-Zeichen ist deine Verbindung


----------



## GilbertGrape (17. Okt 2008)

vielleicht con.isClosed()


----------



## maki (17. Okt 2008)

>> Danach stürzt mir die Datenbank ab 

DAS ist dein Problem.

Woran liegt das?


----------



## ARadauer (17. Okt 2008)

@Amenophis: das war ein scherz oder?

maki hat recht, das abstürzen müsste man abfangen,
und wie gilbert schon gemeint hat mit con.isClosed prüfen und gegebenen falls die verbindung wieder herstellen...

oder einen connection pool verwenden...


----------



## Michael038945 (18. Okt 2008)

Hallo 

werden PreparedStatements  nicht mit call aufgerufen ?

pst = con.prepareStatement("SELECT * FROM test WHERE ID=?"); 
Beispiel:

```
Connection c = Connector.getConnection();
        int wert = 0;
          try {
           c.setAutoCommit(false);                    
                java.lang.String sql = "{  ?  = call  DiesIstEinTest(?) }"; // (Datenbank) Procedure
                java.sql.CallableStatement call = c.prepareCall(sql);
                call.setInt("ID",<deine ID>);
                call.registerOutParameter(1, java.sql.Types.NUMERIC);
                call.executeUpdate();
                wert = call.getInt(1);
                call.close();
                c.commit();
                c.setAutoCommit(true);
        } catch (SQLException ex) {
           c.rollback();
          c.setAutoCommit(true);
        }
        return wert;
    }
```


natürlich mußt du auf der Datenbank auch eine Prozedure haben mit dem Namen (DiesIstEinTest) 




Gruß Michael


----------



## Gast (18. Okt 2008)

Danke für die Tips,

werde es gleich umsetzen.

Bzgl.
> Danach stürzt mir die Datenbank ab.

Das war nur als Beispiel gemeint. Die DB stürzt mir natürlich nicht dauernd ab, es kann aber vorkommen, das der DB Server neu gestartet wird und dann eben mal die Connection für 30 Sekunden weg ist. Mir soll dann nicht das ganze Programm abstürzen sondern es soll einfach ein neuer Verbindungsaufbau durchgeführt werden.


----------



## Gast (18. Okt 2008)

Ein 

con.isClosed()

geht leider nicht, da die Funktion nur true liefert wenn zuvor con.close() aufgerufen wurde. Da die Verbindungstrennung aber nicht durch Java sondern z.B. durch einen Neustart des DB Servers verursacht wurde ...

Jemand noch eine Idee?


----------



## maki (18. Okt 2008)

Wenn die DB weg ist, ist das schlecht.

Hochverfügbarkeitssysteme müssen damit umgehen, musst du das auch?


----------



## tfa (18. Okt 2008)

Die (Teil-)Lösung ist wie schon gesagt ein Connection-Pool. Zum Beispiel DBCP von Apache. Wenn man mit DBs arbeitet, sollte man sowas immer verwenden.


----------

