Threadsicherheit von MySQL-Verbindungen

Status
Nicht offen für weitere Antworten.

Freddy

Mitglied
Kennt sich hier jemand mit der genaueren Beschaffenheit von Verbindungen des MySQL Connector/J 2.0 aus?
Ich arbeite an einem Chatserver, dessen Benutzerverwaltung mit MySQL realisiert ist. Nun kann es ja passieren, dass sich zwei Benutzer gleichzeitig einloggen ---> Thread A holt sich ein Statement von der Verbindung, schickt ein Query ab, während Thread B dies fast gleichzeitig auch macht. Ich kann dieses Szenario nicht erzwingen, um die Auswirkungen (z.B. eine Exception in Thread A oder beschädigtes ResultSet) herauszufinden, und deswegen frage ich mich: Wie muss ich eine Verbindung synchronisieren, um sie Thread-sicher zu machen?

a) garnicht;
b)
Code:
ResultSet res;
synchronized (connection) {
res = connection.createStatement().executeQuery("SELECT * FROM table");
while(res.next()) {
// Daten verarbeiten
}
}
oder
c)
Code:
ResultSet res;
synchronized (connection) {
res = connection.createStatement().executeQuery("SELECT * FROM table");
}
while(res.next()) {
// Daten verarbeiten
}

Noch einmal zur Verdeutlichung: In Beispiel b) ist die Verarbeitung des ResultSet in den synchronisierten Block mit einbezogen, bei c) steht sie außerhalb.
 

bummerland

Top Contributor
meiner meinung nach braucht die funktion, in der der sql-befehl ausgeführt wird, das keyword synchronized. damit wird sichergestellt, dass die funktion zu ende ausgeführt wird, bevor eine andere dran kommt. (bin mir aber nicht 100% sicher)
 

Freddy

Mitglied
Ob executeQuery() synchronisiert ist oder sein muss, weiß ich ja eben nicht. Aber selbst wenn dies der Fall ist, kann ja ein anderer Thread mit einem Query auf der gleichen Verbindung meinem ResultSet in die Quere kommen.
 

bummerland

Top Contributor
ich denke mal, dagegen beugt mysql selbst auch vor, indem immer nur 1 befehl gleichzeitig ausgeführt werden kann, oder?
 

Freddy

Mitglied
Wenn ich gleichzeitig mit mehreren Threads in eine Verbindung schreibe, dann krieg ich entweder ne Exception oder es kommt Datenmüll an. Und ich frage ja nun gerade, ob da ein Schutz ist.
 

omosde

Mitglied
Wenn es dir als Frage nur darum geht, ob es sicher ist, wenn 2 oder mehr Anfragen (theoretisch) gleichzeitig bei der Datanbank eintreffen, dann sollte eine synchronisation der Threads nicht notwendig sein! Solange setAutoCommit() fuer die connection gilt, sollte diese Sicherheit auf jeden Fall die DB uebernehmen! Sie fuehrt die Anfragen dann nacheinander oder quasiparallel!

Wenn du dir nicht sicher bist, dann schreib dir doch nen kleines Proggi, was auf einer Verbindung ueber mehrere Threads nichts anderes tut, als den DB-Server mit Anfragen zu bombadieren!

MfG
omosde
 

Freddy

Mitglied
Ich habe mir jetzt solch ein kleines "DoS"-Programm programmiert, welches mit 100 Threads gleichzeitig auf einer Verbindung soviele SELECT-Anfragen wie möglich ausführt. In einer Minute wurden bis zu 11709 Queries gesendet und deren ResultSets über System.out ausgegeben. Erstaunlicherweise tauchte nicht eine Exception auf, obwohl ich diesen Test mehrmals gemacht habe.

Also: Problem gelöst. Danke ;)
 

DTR

Bekanntes Mitglied
Hi,
ich weiß ja nicht, wann du deine Abfragen absetzt, oder wie dein Programm sonst organisiert ist. Vieleicht geht das bei dir ja auch Problemlos. Aber grundsätzlich würde ich nicht eine Connection öffnen und während der gesamten Verarbeitung offen lassen, sonder am Anfang einer Methode eine Connection öffnen und am Ende Wieder schließen. Das hat einerseits den Vorteil, das du für jeden Thread eine eigene Connection hast, andererseids kommt es so nicht zu einem Unerwarteten Timeout der Connection, was meiner Meinung nach der Hauptvorteil der Geschichte ist.
 

Freddy

Mitglied
Bei MySQL tritt dieser Timeout erst nach 8 Stunden ein, und mit dem Property autoReconnect lässt sich auch dieses Problem lösen.
Jeder Verbindungsaufbau braucht unnötig (Rechen-)Zeit und CPU, die man sparen kann, indem man eine persistente Verbindung benutzt. Ich sehe da nur Vorteile gegenüber temporären Verbindungen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu threadsicherheit bei singletons Allgemeine Java-Themen 6
N MySQL mit Strings Allgemeine Java-Themen 3
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
C MySQL Tabellen sortieren. Allgemeine Java-Themen 33
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
V Maven Maven ClassNotFoundException MySQL JDBC Treiber Allgemeine Java-Themen 1
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
R Praktikums Projekt Java vs MySQL Allgemeine Java-Themen 91
C JPA und mysql Allgemeine Java-Themen 3
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
J javaFX mySQL Allgemeine Java-Themen 3
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
P MYSQL Datenbank Dump einspielen Allgemeine Java-Themen 1
F eclipse, texlipse, R und mysql Allgemeine Java-Themen 2
S WebApp MySQL Connection Loss Allgemeine Java-Themen 10
H Tablemodel und mysql Allgemeine Java-Themen 8
T Datumsformat für MySQL Allgemeine Java-Themen 4
S ANT mysql treiber einbinden Allgemeine Java-Themen 4
F Ärger mit mySQL Allgemeine Java-Themen 3
S Java Methode um Daten aus MySQL auslesen Allgemeine Java-Themen 11
S Excel in mySQL importieren Allgemeine Java-Themen 3
neurox Tutorial: Hibernate mit MySQL (erste Schritte) Allgemeine Java-Themen 34
M JAVA Timestamp aus Mysql Allgemeine Java-Themen 4
T MySQl Datenbank als Array ausgeben Allgemeine Java-Themen 11
hdi Applet, JavaScript, PHP, mySQL -> Was brauch ich? Allgemeine Java-Themen 3
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
H Daten aus MySQL datenbank auslesen und in ArrayList stecken Allgemeine Java-Themen 8
G mySQL und JTable Allgemeine Java-Themen 7
G MySql+Java+backup Allgemeine Java-Themen 23
I JAVA+ MySQL locales statement? Allgemeine Java-Themen 2
B Importieren in MySQL mit Java-Programm Allgemeine Java-Themen 15
G mysql datum umwandeln mittels jsp Allgemeine Java-Themen 10
G Mysql --> Datumsformat Allgemeine Java-Themen 7
C Umlaute mysql Allgemeine Java-Themen 3
V MySql db unter Java zum laufen bringen. Allgemeine Java-Themen 2
C Rechte unter WinXP, MySQL-Server per Runtime herunterfahren? Allgemeine Java-Themen 6
G Datum in MySQL Timestamp umwandeln? Allgemeine Java-Themen 10
G Daten aus MySQL-Datenbank an JFreeChart übergeben Allgemeine Java-Themen 3
G MySQL-Problem (LOAD DATA INFILE) Allgemeine Java-Themen 5
B Sehr großen Graph mit Verbindungen bauen und minimieren? Allgemeine Java-Themen 35

Ähnliche Java Themen

Neue Themen


Oben