2016-04-20 8 views
0

Ist es notwendig, Eingabe- und Ausgabeanweisungen auf MySQL zu synchronisieren?Ist es notwendig, die E/A-Operation mit MySQL zu synchronisieren?

Datenbank

public class Database { 
      private Object locker = new Object(); 

      public boolean createUser(String username, String password) { 
       synchronized (locker) { 
        //INSERT statement 

       } 
      } 

      public boolean isValidLoginAndPassword(String login, String password) { 
       synchronized (locker) { 
        //SELECT statement 
       } 
      } 
     } 
+0

Keine Ahnung, was Sie hier tun, und es gibt nicht annähernd genug Informationen zu sagen, wenn es falsch ist. Wahrscheinlich ist es irreführend - Sie sollten sich Transaktionen ansehen. –

+0

P.S. Ich hoffe wirklich, Sie speichern Ihre Passwörter hashed! Und mit 'PreparedStatement'. –

+0

https://github.com/Cezikos/shiny-enigma/blob/master/src/Server/Database.java –

Antwort

1

Die einzige Zeit, die Sie brauchen synchronized Thread-Sicherheit zu erzwingen ist. Andere Fragen haben sich der Frage Is java.sql.Connection thread safe? gestellt. Die kurze Antwort darin ist, dass meistens, nein, Sie brauchen keine Thread-Synchronisation - JDBC-Spezifikation ist Thread-sicher. Dies variiert jedoch je nach sql-Treiber, so dass Sie nicht tatsächlich threadsafe sein können, aber es gibt Bibliotheken, die helfen, dies zu lindern (wie Apache Commons Verbindungspools).

Aber die größere Frage, die Sie vielleicht stellen möchten, ist, dass, selbst wenn sie sind threadsafe, was passiert, wenn zwei Threads versuchen, die gleiche Connection zu verwenden? Einer von ihnen wird warten müssen, was normalerweise unerwünscht ist. Ein Verbindungspool (oder zumindest eine Worker-Warteschlange) ist am sinnvollsten, wenn mehrere Threads die gleiche Arbeit ausführen: Sie haben eine geringere Wahrscheinlichkeit, dass Threads gegenseitig blockiert werden, und Sie müssen sich keine Gedanken über den Treiber machen ist threadsafe.

+0

"Sie sollten vermeiden, Verbindungen zwischen Threads zu teilen" - Wenn mein Server Thread für jeden Client (zu hören) erstellen, sollte ich die gleiche Anzahl von Verbindungen zur Datenbank wie die Anzahl der Threads machen? –

+0

Um zu vermeiden, eine Verbindung zwischen allen Threads zu teilen. –

+0

Nein - es hängt davon ab, was Ihr Anwendungsfall ist, aber die Verwendung eines Verbindungspools ist in der Regel eine gute Idee. Verbindungspools verwalten mehrere Verbindungen, ermöglichen Ihnen jedoch, sie zwischen Threads zu teilen. Wenn eine Anfrage eingeht, erhalten Sie eine Verbindung aus dem Pool (es kann eine neue für Sie erstellen), und wenn Sie fertig sind, geben Sie sie aus dem Pool zurück. Auf diese Weise können Threads (ohne Blockierung) Verbindungen teilen, normalerweise ohne 1-Verbindung pro Thread. Sie können sich Fragen wie http://stackoverflow.com/questions/2835090/how-to-establish-a-connection-pool-in-jdbc ansehen, um mehr zu erfahren. – Knetic