SQLite Datenverlust nach beenden des Programmes

Jochim

Mitglied
Hallo,

ich arbeite nun seit einiger Zeit an einem Projekt rund um die Lagerhaltung. Bei einem Programm zum Ein-/Auslagern von Gütern werden die Produkte mittels eines RFID-Readers gescannt und anschließend kann die gewünschte Menge eingetragen werden.
Nun funktioniert alles soweit, die Güter werden eingelagert und in meiner Tabelle (Nach einem Update) angezeigt. Sobald ich das Programm schließe und neu starte, sind die Daten verloren. Auch wenn ich das Programm schließe und mir mittels eines SQLite Managers die DB anschaue, sind die Daten nicht vorhanden.

Java:
public void adddata(String table, String data[]){
        String sql="Insert into "+table+" values(?,?,?,?)";
        System.out.println("addata mit länge: "+data.length);
        try{
            pst=conn.prepareStatement(sql);
            pst.setString(1, data[0]);
            pst.setString(2, data[1]);
            pst.setString(3, data[2]);
            pst.setString(4, data[3]);
            pst.execute();
            System.out.println("Saved");
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e);
        }
    }

Gruß Jochim
 

thet1983

Top Contributor
prüf doch mal mit :

Java:
int result = pst.executeUpdate();
// Abfrage
if(result > 0){
// gespeichert
}else{
// fehler
}

ich kenn das nur mit
Code:
.executeUpdate();
 

Jochim

Mitglied
prüf doch mal mit :

Java:
int result = pst.executeUpdate();
// Abfrage
if(result > 0){
// gespeichert
}else{
// fehler
}
Keine Veränderung, result ist > 0 und der Datensatz geht trotzdem verloren.

Ich würde auf einen fehlenden close tippen
Habe ein close angehängt aber es Funktioniert trotzdem nicht.

mach mal nach dem execute noch ein commit() obs daran liegt?
Wenn ich ein commit() mache wird mir die Meldung: java.sqlException: database in auto-commit mode, ausgegeben.

Gruß Jochim
 

Dompteur

Top Contributor
Nun funktioniert alles soweit, die Güter werden eingelagert und in meiner Tabelle (Nach einem Update) angezeigt. Sobald ich das Programm schließe und neu starte, sind die Daten verloren. Auch wenn ich das Programm schließe und mir mittels eines SQLite Managers die DB anschaue, sind die Daten nicht vorhanden.
Heißt das, dass du während des Programmlaufs die neu angelegten Daten auch wieder liest und dass sie da vorhanden sind ?

Kann es sein, dass du irrtümlich mit einer In-Memory-Datenbank arbeitest ?
 

Jochim

Mitglied
Heißt das, dass du während des Programmlaufs die neu angelegten Daten auch wieder liest und dass sie da vorhanden sind ?
Nachdem ich die Daten eingelagert habe, wird mir eine Übersicht des Lagers angezeigt. Und es Funktioniert auch, dass ich die Menge erhöhen kann bzw. wieder etwas auslagern kann.

Kann es sein, dass du irrtümlich mit einer In-Memory-Datenbank arbeitest ?
Von dieser Möglichkeit habe ich noch nichts gehört, gewollt ist dies zumindest nicht. Wie erkenne ich ob ich irrtümlich damit arbeite?
 

thet1983

Top Contributor
mach mal so:
Java:
public synchronized void addData(String table, String data[]){
   String sql = "INSERT INTO "+table+" VALUES(?,?,?,?)";
   try{
      pst = con.prepareStatement(sql);
      pst.setString(1, data[0]);
      pst.setString(2, data[1]);
      pst.setString(3, data[2]);
      pst.setString(4, data[3]);
   
/*-->>*/int rs = pst.executeUpdate(); // --> nicht exceute() verwenden!
      System.out.printl((rs > 0)? "gespeichert":"nicht gespeichert");
     pst.close();
   }catch(Exception e){
       e.printStackTrace();
   }
}

ich glaube da das mit dem
Code:
execute();
nicht ganz passt...

Code:
int executeUpdate()
Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
 
Zuletzt bearbeitet:

thet1983

Top Contributor
du hast es so gemacht wie ich es geschrieben habe mit synchronized und executeUptade()??
nicht falsch verstehen, speicherst du auch wirklich in die richtige DB oder table oder
brichst du die transaktion irgendwo ab, rollback(), close().....
 

Jochim

Mitglied
Java:
public void adddatainventory(String data[]){
        String sql="Insert into inventory values(?,?,?,?)";
        System.out.println("addata mit länge: "+data.length);
        try{
            pst=conn.prepareStatement(sql);
            pst.setString(1, data[0]);
            pst.setString(2, data[1]);
            pst.setString(3, data[2]);
            pst.setString(4, data[3]);
           
            int result=pst.executeUpdate();
            System.out.println((result > 0)? "gespeichert":"nicht gespeichert");
            pst.close();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e);
        }
    }

Das ist meine aktuelle Methode, anschließend aktualisiere ich die Tabelle mittels:
Java:
private void Update_table(){
        rs=dh.SelectTable("SELECT * FROM inventory");
        tbl_stock.setModel(DbUtils.resultSetToTableModel(rs));
        dh.close();
    }
Dort wird mir die Table mit den neuen Werten korrekt ausgegeben. Zu dem close: Meine Methoden zum zugriff auf die Datenbank stehen in einer anderen klasse, daher dh.close(), auch wenn ich diese Zeile auskommentiere Funktioniert es nicht
 

Dompteur

Top Contributor
Nachdem ich die Daten eingelagert habe, wird mir eine Übersicht des Lagers angezeigt. Und es Funktioniert auch, dass ich die Menge erhöhen kann bzw. wieder etwas auslagern kann.
Nur noch einmal zur Sicherheit: Du liest die Werte auch aus der Datenbank aus und verwendest nicht einfach die Java Objekte weiter ?

Nachtrag: Das hast du gerade (als ich die Frage schrieb) beantwortet.

Von dieser Möglichkeit habe ich noch nichts gehört, gewollt ist dies zumindest nicht. Wie erkenne ich ob ich irrtümlich damit arbeite?
Zeig uns einmal wie du die Datenbank-Connection aufbaust.
 

Jochim

Mitglied
Zeig uns einmal wie du die Datenbank-Connection aufbaust.

Dies ist meine Klasse JavaConnection:
Java:
public class JavaConnection {
    Connection conn=null;
    static String Laufwerk="G";
    public static Connection ConnecrDB(){
        try{
            Class.forName("org.sqlite.JDBC");
            Connection conn=DriverManager.getConnection("jdbc:sqlite:"+Laufwerk+":\\Warenwirtschaftsprogramm\\Warenwirtschaftssystem\\wawi.sqlite");
            return conn;
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e);
            return null;
        }
    }
}

und hiermit verbinde ich mich mit der DB:
Java:
conn=JavaConnection.ConnecrDB();
 

Dompteur

Top Contributor
Das sieht für mich unverdächtig aus.

Wahrscheinlich bleibt dir nichts anderes übrig als das Beispiel zu weit wie möglich auf das Wesentliche zu reduzieren.
 

Jochim

Mitglied
Ist es denn sinnvoll, die Methoden die auf die Datenbank zugreifen in eine extra Klasse zu schreiben? Weil wenn es keinen Sinn macht dann könnte ich dort mögliche Fehler ausschließen.
 

Jochim

Mitglied
Ich verstehe das nicht ganz. ich möchte mal erklären wie es bei mir Aufgeteilt ist:
In meiner Main-Klasse befindet sich alles zum Frame und das nötige zum Umwandeln der Daten.
Mit der Klasse DataHandling greife ich auch die Datenbank zu. Beispiel:
Beim Update der Tabelle gibt mit die Klasse DataHandling ein ResultSet zurück, das ich anschließend in meiner JTable anzeige.
 

Jochim

Mitglied
Ich habe nun einen Lösungsweg gefunden, ich mache zusätzlich ein conn.close() und bevor ich die Tabelle Update, Verbinde ich mich wieder mit der Datenbank. So funktioniert es nun, doch normalerweise ist das doch nicht nötig oder?
 

Tom299

Bekanntes Mitglied
Man läßt eine Connection nur so lange offen, wie man sie braucht, danach schließt man sie wieder, d.h. nach einen Update, Insert, etc. macht man sie zu und beim nächsten Mal wieder vorher auf.
 

stg

Top Contributor
Man läßt eine Connection nur so lange offen, wie man sie braucht, danach schließt man sie wieder, d.h. nach einen Update, Insert, etc. macht man sie zu und beim nächsten Mal wieder vorher auf.

Für jedes Statement auf keinen Fall, nicht mal unbedingt zwingend für jede Transaktion. "so lange offen, wie man sie braucht", wie du ja selbst sagst, trifft es da viel besser. Das kann aber durchaus für die Dauer mehrerer Transaktionen mit zahlreichen abgesetzten Statements sein. Und selbst dann wird man sie anschließend in aller Regel nur logisch schließen, nicht aber physisch, soll heißen statt sie selbst zu schließen gibt man sie einfach in einen Pool von Connections zurück und überlasst es dem Pool, ob und wann er die Verbindung tatsächlich schließt. Ein physischer Verbindungsaufbau kostet jedenfalls viel Zeit.
 

Tom299

Bekanntes Mitglied
Ja, ich meinte damit für sagen wir einen "Block" oder Workflow. Manchmal hat man ja wirklich nur 1 Update oder Insert beim Speichern einer Maske, manchmal sind es halt viele SQLs, bis man den Workflow durchlaufen hat. Aber danach schließt man und läßt die Connection nicht bis zum Sankt Nimmerleinstag offen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Datenverlust Datenbankprogrammierung 19
G Datenverlust! Datenbankprogrammierung 2
G Datenverlust bei DB-Unterbrechung? Datenbankprogrammierung 4
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
T JPA: Nach String statt Primärschlüssel suchen Datenbankprogrammierung 9
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
M SQLite Suche nach String Datenbankprogrammierung 4
G PostgreSQL Nach Monaten auf einmal ClassNotFound-Exception Datenbankprogrammierung 3
C MySQL JTable in JScrollPane nach insert aktualisieren Datenbankprogrammierung 3
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
B Leerzeichen nach Umlaut -> Sichtbar erst nach Query! Datenbankprogrammierung 6
D Zeit von SQL nach Java Datenbankprogrammierung 2
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
AssELAss Oracle Suche nach Umlauten Ä und Ae ermöglichen Datenbankprogrammierung 11
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
Z PDF nach Formate sortieren Datenbankprogrammierung 3
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
F Java SQL Syntax Error erst nach mehrmaligen Aufrufen Datenbankprogrammierung 3
R vor/nach INSERT mysql-SETS absetzen Datenbankprogrammierung 2
C Programm wird nach DB-Eintrag nicht weitergeführt Datenbankprogrammierung 5
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
S Nochmals: ID ermitteln nach Insert Datenbankprogrammierung 2
P JPA- Entities bleiben nach dem Löschen (unsichtbar?) in der Datenbank Datenbankprogrammierung 6
GianaSisters MS SQL unter Netbeans OK - nach konvertieren Absturz Datenbankprogrammierung 6
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
M Datenbankeintrag bleibt nach Löschen in JSP vorhanden Datenbankprogrammierung 8
0 Filtern nach mehreren Kriterien Datenbankprogrammierung 4
T filtern nach expliziten Worten trotz LIKE '%Wort%' Datenbankprogrammierung 2
E Nach Server wechsel Datenbank fehler ?!? Datenbankprogrammierung 3
F SQL ordnen nach zueinander in Verhältnis gesetzten Spaltenwerten Datenbankprogrammierung 11
J SQL: Sortierung nach Wortlänge Datenbankprogrammierung 2
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
T JPA: NullPointerException nach persist Datenbankprogrammierung 3
T Eintragung in einer Spalte nach Abfrage Datenbankprogrammierung 11
E Hibernate Session closed nach Transaction commit? Datenbankprogrammierung 7
K Rundungsfehler bei Gleitkommazahlen von Java nach SQL Datenbankprogrammierung 2
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
alexpetri Problem mit jdbc MS Access / nach 670 inserts ist schluss. Datenbankprogrammierung 4
tfa Apache DBCP: Reconnect nach Timeout? Datenbankprogrammierung 3
M mySQL zugriff funktionert nach ca4 stündiger laufzeit nicht Datenbankprogrammierung 6
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M sql-code für suche in tabelle nach höchster transaktionsnr Datenbankprogrammierung 12
T ibatis + "generated p-key" nach insert? Datenbankprogrammierung 24
G Herausfinden des Primary Keys nach INSERT-Kommando? Datenbankprogrammierung 4
T Tabellen aus Datenbank 1 nach Datenbank 2 Datenbankprogrammierung 2
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
G Suchen nach Autowerten in Access-DB Datenbankprogrammierung 20
D JAVA hängt nach SQL Abfrage Datenbankprogrammierung 7
I Nach export zur .jar keine verbindung mehr Datenbankprogrammierung 7
M Datenbankverbindung bricht nach ca. 12 Stunden Verbindung ab Datenbankprogrammierung 3
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
G File nach Blob konvertieren ? Datenbankprogrammierung 6
M Abfrage trennt Ergbnis eines Atrributes nach den Leerzeichen Datenbankprogrammierung 4
F Treiber nachladen oder nach Bedarf Datenbankprogrammierung 4
P Primärschlüssel direkt nach der Eingabe wieder auslesen Datenbankprogrammierung 7
R MySQL Syntax für suche nach Textteil Datenbankprogrammierung 8
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben