2016-07-09 13 views
-1

Meine Web-App (das ist kein Spring-MVC hier, nur Core IOC) verwendet eine Menge Prototypbohnen und die meisten verwenden eine Singleton-Dao-Bohne. Sollten die Singleton-Dao-Bean-Methoden synronisiert werden, da viele verschiedene Prototyp-Beans (aus unterschiedlichen Anfragen) dieselbe Method-ID Dao im selben Moment verwenden können?Sollen die Singleton-Methoden synchronisiert werden?

Zum Beispiel der dao Methode

public void setLetterNotNew(int letterId) { 

    final String sql = "UPDATE income SET isnew=? WHERE id=?"; 

    try(Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) { 

     ps.setInt(1, 0); 
     ps.setInt(2, letterId); 

     int i = ps.executeUpdate(); 
     if(i==0) throw new SQLException("setLetterNotNew"); 

    } catch (SQLException e) { 
     log.error(e); 
    } 
} 
+0

Hängt davon ab, wie Sie die DB aktualisieren. Viele Frameworks sind bereits synchronisiert, so dass Sie keine zusätzlichen Arbeiten ausführen müssen. Überprüfen Sie Ihre Dokumente. – markspace

+0

@markspace Das ist kein Rahmen hier ecxept von Frühling-ioc. Dies ist eine Servlet-basierte Web-App. Die Datenbank wird über standart jdbc aktualisiert. – furry

+0

ja, Sie sollten die Methoden des Singleton synchronisiert oder zumindest den Teil, dass es in die DB zwischen einem synchronisierten Block geht. Überprüfen Sie auch, wie Sie planen, das Singleton zu erstellen und zu erhalten, so dass Sie nicht mit zwei Instanzen enden – Rumal

Antwort

0

Es hängt davon ab.

Wie Sie in einem Kommentar geschrieben haben, verwenden Sie jdbc. Alle Operationen auf JDBC API are synchronized und tun auto-commit by default. Wenn Sie also Ihre JDBC-Verbindung freigeben, Ihre Methode jedoch keine Transaktion benötigt (z. B. keine Aktualisierung von Daten, die wenige Zeilen zuvor ausgewählt wurden), muss sie nicht synchronisiert werden.

Wenn Sie jedoch Transaktionen benötigen, müssen Sie diese Methode entweder synchronisieren oder jedem Thread eine eigene JDBC-Verbindung zuweisen, z. B. each connection is also a transaction. Um das zu erreichen, könnten Sie jedes Mal eine neue Verbindung in einer Methode öffnen oder lassen Sie Spring handle that problem

+0

Wie kann ich definieren, ob die Methode eine Transaktion benötigt? Ich habe die Frage aktualisiert. Ich bekomme Verbindung vom Pool (eine statische Methode HikariFactory.getConnection()) und die Verbindungen schließt automatisch. Ich weiß auch, dass Jdbc Multi-Threading auf Datenbankebene behandelt. Die betreffende Methode enthält also keinen Zustand. Wie kann Multithreading in diesem Fall falsche Dinge tun? Eigentlich denke ich, dass die beste Idee ein Prototyp für Dao-Bohnen ist, dann muss man sich nicht um Multitheading sorgen. – furry

+0

Wenn die Methode keinen Status enthält, ist es sicher, sie so zu verwenden, wie sie ist, ohne dao zu Prototyp-Bean zu ändern oder sie zu synchronisieren. Wenn es sich bei Ihrer Anweisung um ein einzelnes Update handelt, ist keine Transaktion erforderlich. Transaktionen werden verwendet, um sicherzustellen, dass mehrere Abfragen, die gleichzeitig verwendet werden, mit denselben Daten aus der Datenbank arbeiten. In Ihrem Fall gibt es nur eine Aussage, also gibt es kein Problem. –