MySQL Eine Instanz von eigenem DBWrapper -> Fehler durch mehrfachbenutzung möglich?

serjoscha

Mitglied
Hallo zusammen.

Ich habe mir für ein Java Programm einen MySQL Wrapper geschrieben, damit es schlichtweg einfacher für mich ist im Programm Datenbankverbindungen aufzubauen und Querys abzusetzen.

Jetzt ist es so, dass die Daten für die DB aus x Threads kommen können.

Das Programm analysiert kurz gesagt hot plug devices (usb festplatten und sticks) und startet sobald es mitbekommt, dass ein neues Gerät angeschlossen wurde ein Thread das seinerseits Änderungen auf genau diesem gerade angeschlossenen Laufwerk überwacht und die gefunden Daten dann in die
DB Speichert (und das auch fortan tut, bis die Platte getrennt wird).

Und nun zum Problem:

Die Daten in der DB sind zum Teil (nicht komplett!) völlig wirr. Ich war nicht in der Lage herauszufinden, wann genau das passiert, wann also die Daten Integrität über die Wupper geht. Aber ich mutmaße,
dass das passiert, wenn 2 Threads gleichzeitig meinen DB Wrapper (Objekt) benutzen *von dem es nur eine Instanz gibt*

Mit wirren Daten meine ich, dass *Teile* des Inhalts einer Festplatte in der DB der falschen Festplatte (dafür gibts Einträge in der DB) zugeordnet werden.

Aber letztendlich macht das Programm nicht mehr als rekursiv über den Inhalt der Platte zu iterieren und alles in die DB zu speichern. Mehr passiert da nicht. An der Stelle kann also eigentlich kein wirr-warr entstehen.

Kann es also sein, dass die "gleichzeitige" Benutzung des DB Wrappers aus 2 verschiedenen Threads heraus Ressource Probleme verursacht die Daten völlig wirr und über Kreuz in die DB schreiben?

Hier der DB Wrapper:

Java:
package misc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Logger;

import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;

public class MySQL_Wrapper {

	private Connection con;
	
	private String user, pass, host, db;
	
	private boolean connected;
	
	public MySQL_Wrapper() {
		// Explicit set vars to null
		this.user = null;
		this.pass = null;
		this.host = null;
		this.db = null;

		this.loadDriver();
	}
	
	public MySQL_Wrapper(String user, String pass, String host, String db) {
		this.user = user;
		this.pass = pass;
		this.host = host;
		this.db = db;
		
		this.loadDriver();
		
		this.connect();
	}
	
	private void loadDriver() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			Logger.getLogger("global").info("KRITISCHER FEHLER: Konnte MySQL Driver nicht laden!\n" + e.getMessage());
		}
	}
	
	/**
	 * tells the wrapper to connect to the DB
	 * @param user
	 * @param pass
	 * @param host
	 * @param db
	 * @return a boolean which tells wether the connection was successfull or not
	 */
	public boolean connect(String user, String pass, String host, String db) {
		try {
			this.con = DriverManager.getConnection( "jdbc:mysql://" + host + "/" + db, user, pass);
			connected = true;
			return true;
		} catch (SQLException e) {
			connected = false;
			Logger.getLogger("global").info("KRITISCHER FEHLER: Konnte nicht zur Datenbank verbinden!\n" + e.getMessage());
			return false;
			//System.exit(0); // new: dont exit for it seems the program looses connection from time to time
		}
	}
	
	public boolean connect() { // delegates
		return this.connect(this.user, this.pass,this.host, this.db);
	}
	
	public void setConnectionData(String user, String pass, String host, String db){
		this.user = user;
		this.pass = pass;
		this.host = host;
		this.db = db;
	}
	
	public void disconnect() {
		try {
			this.con.close();
		} catch (SQLException e) {
			Logger.getLogger("global").info("Konnte Verbindung zum MySQL-Server nicht trennen.\n" + e.getMessage());
		}
	}
	
	/**
	 * Nicht geeignet um Daten aus der Datenbank zu lesen
	 * @param qry Die Query
	 * @return affected rows
	 */
	public int sendQry(String qry) {
		if(this.con == null)
			Logger.getLogger("global").info("KRITISCHER FEHLER: Du hast eine Query agesetzt ohne vorher eine Verbindung zur DB aufgebaut zu haben");
		
		/**
		 * Note: Copying the Entries into the Archive Table causes a "Duplicate Entry"-Exception every time...
		 */
		try {
			Statement stmt = this.con.createStatement();
			qry = this.escapeQuery(qry); // escape
			int affected = stmt.executeUpdate(qry);
			return affected;
		}
		catch (MySQLIntegrityConstraintViolationException e) {
			//System.out.println(e.getMessage());
		} catch (SQLException e) {
			Logger.getLogger("global").info("KRITISCHER FEHLER: Die Query enthält Fehler!\n" + e.getMessage() + "\n" + e.getSQLState());
		}
		return 0; // im Fehlerfall
	}
	
	/**
	 * Query, die ein Result set zurückgibt... Die benutzung ist etwas hacky umgesetzt
	 * @param qry
	 * @param anyVal völlig egal! Kann alles sein, true oder false oder sonst was... der Wert ist völlig egal und wird nur benutzt um eine andere Methoden Signatur zu erhalten
	 * @return ResultSet der Daten die gefunden worden
	 */
	public ResultSet sendQry(String qry, Object anyVal) {
		if(this.con == null)
			Logger.getLogger("global").info("KRITISCHER FEHLER: Du hast eine Query agesetzt ohne vorher eine Verbindung zur DB aufgebaut zu haben");
		try {
			Statement stmt = this.con.createStatement();
			qry = this.escapeQuery(qry); // escape
			return stmt.executeQuery(qry);
		}
		catch (MySQLIntegrityConstraintViolationException e) {
		} catch (SQLException e) {
			Logger.getLogger("global").info("KRITISCHER FEHLER: Die Query enthält Fehler!\n" + e.getMessage() + "\n" + e.getSQLState());
		}
		return null; // !!!
	}
	
	private String escapeQuery(String baseString) {
		// Currently only escape backspaces -> \ to \\
		return baseString.replace("\\", "\\\\");
	}
	
	public boolean isConnected() {
		return connected;
	}

}

Danke im Voraus!

Liebe Grüße, Serjoscha

ps. ich nehme auch gerne Tipps für eine Alternative zu meinem eigenen DB Wrapper entgegen
 

fastjack

Top Contributor
Das Connection-handling würde ich global machen. Ansonsten kann ein Thred einfach die Connection killen und dann wars das für die anderen Threads.

Du kannst auch jedem Thread eine Instanz vom Wrapper anbieten, dann kommen sie sich nicht in die Query, jedenfalls, was den Wrapper betrifft.

* loadDriver muss Du nur einmal in der App machen
* anyVal wird gar nicht verwendet
 
Zuletzt bearbeitet:

serjoscha

Mitglied
Das Problem ist wohl, dass der Rechner zwischenzeitlich immer mal in den Standby fährt und dann die Verbindung einen Timout bekommt. Ich vermute dass der mySQL connector NOPs sendet um die Verbindung am Leben zu halten, was er dann aber nicht kann wenn der Rechner im s3 ist.
Wenn der Rechner dann wieder da ist und das Programm versucht Daten in die DB zu schreiben kracht es mit einer nicht mehr validen Verbindung, was dazu führt, dass ich für jedes Mal wenn Daten geschrieben werden sollen eine Verbindung aufbaue und sie wieder trenne, wenn die Daten geschrieben worden sind.

Pseudecode:

Überwachungs Thread meldet dem Controller Änderungen:

Controller:

- Verbinde zur DB
- Parse Daten
- Persistiere Daten
- Trenne Verbindung

Ich vermute dass genau das zu einem Problem führt wenn 2 Threads sich gleichzeitig beim Controller melden. Der läuft seinerseits nämlich nicht im Thread.

Wird die Listener Implementation dann eigentlich ge'queue'd?

Danke für deine Antwort!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
Zrebna PostgreSQL-Query in eine MicrosoftSQL-Query konvertieren - chatGPT hilft nur bedingt. Datenbankprogrammierung 3
T Spring MongoDB: Prüfen ob bereits eine Email existiert Datenbankprogrammierung 15
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
Zrebna Wie mittels PL/SQL eine Datenbankverbindung blockieren? Datenbankprogrammierung 6
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
Z Aus zwei bestehenden Table eine zusätzliche Gemeinsame machen (JavaFX) Datenbankprogrammierung 21
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
pkm PostgreSQL Auf eine Spalte kann aus einem Teil der SQL-Aussage nicht zugegriffen werden Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
G Eine Spalte in xampp als Typ array erstellen - ein array mit "insert" hinzufügen. Datenbankprogrammierung 3
F Create Table - Habe ich eine schwache Entität erzeugt ? Datenbankprogrammierung 4
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
B MySQL Eine Art Sverweis Datenbankprogrammierung 27
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
B SQL-Statement Prüfen ob eine Spalte einen Wert enthält Datenbankprogrammierung 2
X SQLite Erhalte bei Query INSERT INTO eine NullPointerException Datenbankprogrammierung 10
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
N Wie in Java Zugriffe und Updates auf eine Datenbank regeln ? Datenbankprogrammierung 1
E Wie kann ich aus diesem XML eine XMLTABLE-Funktion bauen? Datenbankprogrammierung 3
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
M Warum ist es suboptimal viele Indexe auf eine Datenbanktabelle zu setzen? Datenbankprogrammierung 4
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
D SQL Update auf eine Query möglich? Datenbankprogrammierung 4
S SqlObject - eine objektorientierte Art SQL-Statements zu schreiben. Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
K SQLite CSV-Datei einlesen in eine Datenbank Datenbankprogrammierung 7
E Datenbank Abfragen in eine GUI schreiben Datenbankprogrammierung 8
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
L MySQL MySql in eine Application einbinden? Datenbankprogrammierung 18
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
H Derby/JavaDB Eine verschlüsselte Derby-Datenbank wieder entschlüsseln Datenbankprogrammierung 4
D Was passiert bei absolut zeitgleichem Zugriff auf eine Tablerow Datenbankprogrammierung 7
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
I Zugriff auf eine Datenbank auf dem Webserver Datenbankprogrammierung 2
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
H Derby/JavaDB SQLException wenn die Datenbank in eine Jar gepackt wurde. Datenbankprogrammierung 6
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
S Werte aus Datenbank auslesen und in eine bestimmte Excelzelle eintragen Datenbankprogrammierung 2
T Wer kann mir eine Datenbank empfehlen Datenbankprogrammierung 13
DStrohma MS SQL Server 2005 + Java: Immer nur eine aktive Verbindung erlaubt? Datenbankprogrammierung 5
D MySQL Wie schreibe ich in eine Datenbank? Datenbankprogrammierung 8
J String[] in eine SQL-Anweisung implementieren Datenbankprogrammierung 13
Q Access Datenbank in eine Internetseite einbinden Datenbankprogrammierung 2
J Über einen Button eine SQL-DB aussuchen Datenbankprogrammierung 3
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
M Zugriff auf eine Access-Datenbank innerhalb eines jar-Files Datenbankprogrammierung 7
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
G Wie sieht eine Datenbankverbindung mit jndi aus? Datenbankprogrammierung 3
T eine Datenbank updaten Datenbankprogrammierung 6
C Prüfen, ob eine MySQL-Tabelle bereits existiert Datenbankprogrammierung 7
E Wie auf eine MySql Datenbank zugreifen Datenbankprogrammierung 25
D Werte mit java programm in eine Datenbank einlesen Datenbankprogrammierung 7
T JPQL Query für eine Tabellenansicht Datenbankprogrammierung 2
B Wie persistiert man eine Tree-ähnliche Datenbankstruktur? Datenbankprogrammierung 2
M Aus einem Applet eine Datenbankverbindung starten? Datenbankprogrammierung 26
R Datenbankstruktur für eine renn simulation Datenbankprogrammierung 3
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
G Wie baut man eine Anwendung mit DB Zugriff Datenbankprogrammierung 3
S Als Rückgebewert eine Liste von Werten? Datenbankprogrammierung 3
A Auslesen von Werten aus der DB in eine csv-Datei Datenbankprogrammierung 4
O Oracle 11g wirft bei 90 % der installation eine Exception ? Datenbankprogrammierung 5
T Recordsets in eine JTable einlesen mit Netbeans 6.0 Datenbankprogrammierung 2
R Warum kommt eine Exception bei instanceof ? Datenbankprogrammierung 4
M Tabelle von einer Datenbank in eine Andere Datenbankprogrammierung 4
G Inhalt eine Clob Feldes zw. zwei DB's kopieren Datenbankprogrammierung 2
A Einlesen einer csv-Datei in eine H2-Datenbank Datenbankprogrammierung 3
A Kriterium für eine JList neu definieren Datenbankprogrammierung 3
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
J Warum ist es aufwendig eine Datenbankverbindung herzustellen Datenbankprogrammierung 3
M Mit Java .txt-Datei in eine Datenbank einlesen lassen Datenbankprogrammierung 33
S Zugriff auf eine große Datenmenge von MS Access per JDBC Datenbankprogrammierung 11
S von einer DB auf eine andere Zugreifen. Datenbankprogrammierung 2
W Wann ist eine Telefonnummer atomar ? Datenbankprogrammierung 3
D Dateien in eine OODB abspeichern Datenbankprogrammierung 3
A Eine einzelne Zeile schreibschützen im DataSet Datenbankprogrammierung 13
E 2 Tabellen anhand eine Spalte zusammenführen? Datenbankprogrammierung 5
M GUI für eine Datenbank Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben