Doppelte Datensätze

Status
Nicht offen für weitere Antworten.

cam

Bekanntes Mitglied
Hallo,

ich habe eine wahrscheinlich blöde Frage...

Wenn man die Verbindung zur Datenbank nicht nach jeder Abfrage beendet, kann es dann passieren, dass Datensätze mehrfach in eine Tabelle geschrieben werden?

Es ist folgendes passiert:
Ich lagere einen Artikel ein - beim ersten Mal funktioniert alles wie es soll - es wird alles richtig in die Lagerplatz-Tabelle geschrieben und auch alles richtig in die Bestands-Tabelle. Wenn ich jetzt aber hintereinander den gleichen Artikel einlagere, ist zwar immer noch alles richtig in der Lagerplatz-Tabelle, aber in der Bestands-Tabelle tauchen die Datensätze plötzlich doppelt und dreifach auf.

Ich möchte nur wissen, ob es an den nicht-geschlossenen Verbindungen liegt, oder ob es auch einen anderen Fehler geben kann. (Bin dabei, den Code zu überarbeiten und hoffentlich zu verbessern.)
 

foobar

Top Contributor
Die Verbindung sollte auf keinen Fall nach jeder Query geschlossen werden, das ist viel zu zeitintensiv.
Wenn du mit reinem Jdbc arbeitest solltest du aber immer darauf achten das Statement und Resultset im Finally-Block zu schliessen, sonst kann es zu einer Fehlermeldung im Dbms kommen wie "Too many open files".
 

Ebenius

Top Contributor
foobar hat gesagt.:
Die Verbindung sollte auf keinen Fall nach jeder Query geschlossen werden, das ist viel zu zeitintensiv.
Nur anbei erwähnt: Das hängt immer davon ab, wie oft die Verbindung benutzt wird. Und wenn man ConnectionPools verwendet, dann sollte die (mehr oder weniger virtuelle) Verbindung auch geschlossen werden, wenn sie nicht mehr benötigt wird. Vorsichtig mit Pauschalurteilen; es gibt immer verschiedene Problemstellungen die verschiedene Herangehensweisen erfordern.
 

foobar

Top Contributor
Ja, Ok ich bin jetzt von einer typischen Java SE Anwendung ausgegangen, da wird normalerweise kein Connectionpool verwendet.
 

cam

Bekanntes Mitglied
Hmhmhm, wie kann der Fehler dann passieren?
Wenn ich das Lagerprogramm beende und jedesmal neu starte, wenn ich etwas einlagern will, macht es alles richtig. Aber man soll ja auch hintereinander weg einlagern können. Ich habe jetzt die Variablen zurückgesetzt, aber nun hab ich eben quasi leere Datensätze in der Datenbank, das Problem ist also damit nicht behoben.
 
M

maki

Gast
>> Hmhmhm, wie kann der Fehler dann passieren?

Dafür gibt es viele, sehr viele Möglichekiten.

Bei denen von dir gelieferten Infos ganz klar: Da stimmt was nicht.

Woran erkennt deine Anwendung dass ein Datensatz schon existiert?
 

cam

Bekanntes Mitglied
Ich schicke euch mal einen Codeausschnitt - ich denke, hier liegt irgendwo der Fehler:

Code:
if(EinlagernM5.boxGr5 == "G0"){
						try{
							PreparedStatement stmG0 = (PreparedStatement) Frame.cn.prepareStatement("INSERT INTO bestand(best_id, eing_zeit, art_nr, art_id, reihe, spalte, ebene, fach, boxgroesse, prim_lapla, reserv, lief) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
							stmG0.setString(1, bestandID);
							stmG0.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
							stmG0.setString(3, Frame.artikelNr);
							stmG0.setString(4, artikelID);
							stmG0.setString(5, Lagerplatz.reihe);
							stmG0.setString(6, Lagerplatz.spalte);
							stmG0.setString(7, Lagerplatz.ebene);
							stmG0.setString(8, Lagerplatz.fach1);
							stmG0.setString(9, EinlagernM5.boxGr5);
							stmG0.setString(10, primLapla);
							stmG0.setBoolean(11, false);
							stmG0.setString(12, Lieferant.lieferant);
							stmG0.execute();
							System.out.println("erledigtReihe1");															
						}catch(Exception ex){
							System.out.println("Keine Verbindung: " + ex);
						}
						try{
							PreparedStatement stmG0 = (PreparedStatement) Frame.cn.prepareStatement("INSERT INTO bestand(best_id, eing_zeit, art_nr, art_id, reihe, spalte, ebene, fach, boxgroesse, prim_lapla, reserv, lief) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
							stmG0.setString(1, bestandID);
							stmG0.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
							stmG0.setString(3, Frame.artikelNr);
							stmG0.setString(4, artikelID);
							stmG0.setString(5, Lagerplatz.reihe);
							stmG0.setString(6, Lagerplatz.spalte);
							stmG0.setString(7, Lagerplatz.ebene);
							stmG0.setString(8, Lagerplatz.fach2);
							stmG0.setString(9, EinlagernM5.boxGr5);
							stmG0.setString(10, primLapla);
							stmG0.setBoolean(11, false);
							stmG0.setString(12, Lieferant.lieferant);
							stmG0.execute();
							System.out.println("erledigtReihe2");															
						}catch(Exception ex){
							System.out.println("Keine Verbindung: " + ex);
						}
						
						/**
						 * UPDATE la_platz
						 */
						
						try{
							PreparedStatement stmG0 = (PreparedStatement) Frame.cn.prepareStatement("UPDATE la_platz SET belegt = ?, best_id = ?, bel_g0 = ?, reserv = ? WHERE reihe = ? AND spalte = ? AND ebene = ? AND (fach = ? OR fach = ?)");
							stmG0.setBoolean(1, true);
							stmG0.setString(2, bestandID);
							stmG0.setBoolean(3, true);
							stmG0.setBoolean(4, false);
							stmG0.setString(5, Lagerplatz.reihe);
							stmG0.setString(6, Lagerplatz.spalte);
							stmG0.setString(7, Lagerplatz.ebene);
							stmG0.setString(8, Lagerplatz.fach1);
							stmG0.setString(9, Lagerplatz.fach2);
							stmG0.executeUpdate();
							System.out.println("erledigtUPDATEla_platz");															
						}catch(Exception ex){
							System.out.println("Keine Verbindung: " + ex);
						}
					}
 

foobar

Top Contributor
Hier mal ein paar generelle Tipps:

Code:
if(EinlagernM5.boxGr5 == "G0"){
Strings vergleicht manmit equals

Warum benutzt du 2 mal die selbe Querie? Das solltest du besser in eine private Methode auslagern und die 2 mal mit unterschiedlichen Werten aufrufen.

Deine Preparedstatements werden nirgends geschlossen. Das ist sehr unschön.

Wenn man eine Exception fängt sollte man diese zumindest loggen siehe Log4J oder java.util.logging.
 

cam

Bekanntes Mitglied
Einige Artikel sind so groß, dass sie über 2 Fächer gelagert werden, G0 gehört dazu, daher 2 mal diese Query (fach1 und fach2).

Ich weiß, dass ich generell viel am Code verbessern muss, aber danke für die Hinweise :wink:
 

foobar

Top Contributor
Ich weiß, dass ich generell viel am Code verbessern muss, aber danke für die Hinweise
Wenn du damit fertig bist, hast bestimmt auch deinen Fehler gefunden *gg*

Füg mal ein paar Traceausgaben ein und überprüf genau wann, wo, welche Query abgesetzt wird und was zu dem Zeitpunkt in der DB steht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P SQL Doppelte Zuweisung von Personalnummern Datenbankprogrammierung 6
L SQL-Statement SQL Statement doppelte Einträge finden Datenbankprogrammierung 9
F MySQL Doppelte Einträge verhindern Datenbankprogrammierung 2
E H2 Doppelte Einträge vermeiden Datenbankprogrammierung 3
K Hibernate mehrfach doppelte Einträge in der Ergebnissmenge Datenbankprogrammierung 5
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
B Doppelte Zeilen einer Doppelten Spalte aus einer Tabelle entfernen. Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Qie bekomm ich das hin --> doppelte Spaltenwerte Datenbankprogrammierung 3
M Datensätze in DataGrip (IntelliJ) Datenbankprogrammierung 1
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
R MySQL Datensätze in Textdokument Datenbankprogrammierung 7
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
R Große Datensätze, kleine Rechte Datenbankprogrammierung 8
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
E primaryKey auslesen - Datensätze abgleichen Datenbankprogrammierung 4
S Häufig vorkommende Datensätze Datenbankprogrammierung 4
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
J Datensätze löschen Datenbankprogrammierung 6
O Löschen vieler Datensätze mit Hibernate Datenbankprogrammierung 11
C Hibernate Datensätze finden Datenbankprogrammierung 17
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
S Anzahl Datensätze in db4o Datenbankprogrammierung 2
D Können nur angesehende Datensätze geloggt werden? Datenbankprogrammierung 4
F NUR 3 datensätze auslesen Datenbankprogrammierung 6
F MySQL Nur die Datensätze zurückgeben, in denen ein anderer Preis steht Datenbankprogrammierung 9
B Aktuellen Stand der Datensätze einer Datenbank anzeigen Datenbankprogrammierung 9
J SQL-Abfrage zur löschung doppelter Datensätze Datenbankprogrammierung 7
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J Datensätze aus der Datenbank holen Datenbankprogrammierung 3
S MySQl - Neue Datensätze "on the Fly" verarbeiten Datenbankprogrammierung 8
M Keine doppelten Datensätze einfügen Datenbankprogrammierung 24
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
T Datensätze effektiv einlesen Datenbankprogrammierung 4
ARadauer viele datensätze. Datenbankprogrammierung 3
I Anzahl unterschiedlicher Datensätze ausgeben Datenbankprogrammierung 2
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
S 50.000 updates auf 50.000 Datensätze Datenbankprogrammierung 3
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
M Datensätze zählen. Datenbankprogrammierung 6
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
M JDBC: Viele Datensätze in Tabelle einfügen: Wie? Datenbankprogrammierung 7
C Datensätze variabel hinzufügen Datenbankprogrammierung 4
K Ältere Datensätze archivieren Datenbankprogrammierung 4
C Datensätze in einer JComboBox auflisten Datenbankprogrammierung 2
V Anzahl der Datensätze abfragen Datenbankprogrammierung 9
W Datensätze v. SQL-Datenbank i. JTextFields ausgeben/updaten Datenbankprogrammierung 12
D Anzahl der zurückgelieferten Datensätze Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben