# importierte Derby DB währen der Laufzeit einlesen



## ToxicAvenger (26. Mrz 2018)

Hallo zusammen,

momentan bin ich gerade dabei das exportieren und importieren meiner kompletten DerbyDB zu implementieren, sodass der Datenbank-Ordner and den gewählten Ort als Zip abgelegt wird, beim importieren wird die vorhandene Datenbank dann überschrieben.

Eigentlich funktioniert das auch schon soweit. Das Problem ist, dass ich das Programm erst neu starten muss damit die importierte Datenbank eingelesen wird. Während der Laufzeit bekomme ich einfach keine Verbindung zur importierten bzw. überschriebenen Datenbank hin. Das Programm scheint temporär mit der alten Datenbank weiter zu arbeiten.

Wenn ich die Connection dann mit connection.close() schliesse und wieder neu aufnehme mit

Connection = DriverManager.getConnection("jdbc:derby:example;create=true");

Bekomme ich die Fehlermeldung, dass aktuell keine Verbindung zur Datenbank bestehe, obwohl connection.isClosed(), false anzeigt.

Vielleicht liegt es ja nur daran, dass die Referenz nicht mehr stimmt, aber nach meiner Aufassung müsste das passen. Deshalb frage ich mal nach ob ich da beim Verbindung schließen und wieder verbinden etwas vergessen habe oder so? 

MfG


----------



## mrBrown (26. Mrz 2018)

Ohne zu wissen, was du da machst, kann man da wenig sagen...

Wenn du eine Connection mit neuen Daten öffnest, sollten das auch eine gültige Connection zu der neuen Datenbank sein.
Verwendest du irgendwas statisches?


----------



## ToxicAvenger (27. Mrz 2018)

Okey ich stelle mal den Code meiner Recovery-Klasse rein(vereinfacht um beim wesentlichen zu bleiben), ich hoffe das reicht zum Verständnis. Mittlerweile bekomme ich die Fehlermeldung, dass keine aktuelle Verbindung besteht nicht mehr...
...Aber beim Aufruf von table.update(), welche die Datenbank ausliest ist das ResultSet einfach leer, das heisst die GUI bekommt keine Daten.

Nein statisch ist nichts mehr, habe deinen Rat damals befolgt ;-)


```
import backupAndRecovery.model.RecoveryModel;
import connection.DBConnector;
import gui.Presentation;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

public class DBRecoveryController {

    private final Presentation presentation;
    private final ArrayList<TableModelInterface> tableModels;
    private final Connection con;
    private final String seperator = System.getProperty("file.separator");
    private final String folderPath = FileSystemView.getFileSystemView().getDefaultDirectory().getPath();
   
    public DBRecoveryController(Presentation presentation, ArrayList<TableModelInterface> tableModels, Connection con) {
        //die GUI Klasse
        this.presentation = presentation;
        //Sammlung aller Tabellen-Models die jeweils auf die Datenbank zugreifen
        this.tableModels = tableModels;
        //Connection welche momentan von allen TableModels verwendet wird
        this.con = con;
        //dem MenuItem den ActionListener übergeben
        presentation.addMenuItemListener(new MenuItemActionListener(), "recovery");     
    }

    class MenuItemActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            JFileChooser chooser = new JFileChooser();
            chooser.setDialogType(JFileChooser.OPEN_DIALOG);
            int flag = chooser.showDialog(null, "wiederherstellen");
            if (flag == JFileChooser.APPROVE_OPTION) {

                try {
                    //schliesst die aktuelle Datenbankverbindung
                    con.close();
                    File file = chooser.getSelectedFile();
                   
                    //BackUp-Zip der Datenbank wird importiert und die momentan bestehende
                    //Datenbank-Ordner damit übeschrieben
                    new RecoveryModel(file, new File(folderPath + seperator + "myDB"));
                   
                    //Verbindung zur importierten Datenbank wieder aufnehmen
                    DBConnector connector = new DBConnector();
                    Connection newCon = connector.getConnection();
                   
                    //neue Connection an alle TableModels übergeben
                    for (TableModelInterface table : tableModels) {
                        //ruft this.statement = newCon.createStatement() auf;
                        table.setConnection(newCon);
                        //Datenbank-Daten werden ausgelesen und die GUI upgedatet;
                        table.update();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(DBRecoveryController.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(DBRecoveryController.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
```


----------

