2016-04-28 16 views
0

Ich habe eine MethodeStatische Methode mit änderbaren Parametern threadsicher?

public static Person updatePersonId (Person person) 
{ 
    // If the ID of the person reaches the maximum ID in our predefined range in configuration then reset the ID from the start otherwise it will cross the range we defined. 
    if (person.getNewID().longValue() == person.getLastPossibleID().longValue()) 
    { 
     person.setNewID (person.getFirstID()); 
    } 

    // add 1 to Old ID to get new ID 
    person.setNewID (person.getNewID + 1); 

    return person; 
} 

ich Hibernate verwenden Sie es in die Datenbank zu aktualisieren.

Wie Sie sehen können, kann ich nicht mehr als eine Person in der Datenbank haben mit ID (wie wir immer 1 zu seiner vorherigen ID hinzufügen).

Jetzt ist das Problem, wenn ich meine Anwendung gleichzeitig laufen, d. H. Zwei Transaktionen zur gleichen Zeit, wird die ID, die der Person zugewiesen wird, manchmal z.

Database row 

PersonID  PersonName 

    1     Bob 
    2     Robert 
    2     Daniel 

Ist die Methode erstellt, nicht Thread sicher? Soll ich ein synchronisiertes Keyword hinzufügen?

+1

Ist meine Methode nicht threadsicher? Soll ich ein synchronisiertes Keyword hinzufügen? NEIN Verwenden Sie DB-Sequenzen –

+0

@ScaryWombat, OP benötigt eine Zyklussequenz. – shmosel

+0

Aber Leute, können wir das ohne Sequenz machen? Und ist meine Methode nicht threadsicher? Gibt es Probleme mit dem gemeinsamen Zugriff, die die doppelte ID verursachen? – Aiden

Antwort

1

Ja, diese Methode ist nicht threadsicher. Wie können zwei Threads auf diese Linie bei sametime erreichen: -

person.setNewID (bnkPrb.getNewID + 1); 

jedoch ganze Methode Synchonisation werden Codes langsam downthe, so nehmen Sie nur diese Zeile erfassen: -

public static Person updatePersonId (Person Person) { // Wenn die ID der Person in unserem vordefinierten Bereich in der Konfiguration dann setzen sie die ID von Anfang an die maximale ID erreicht sonst wird es den Bereich kreuzen wir

definiert
if (person.getNewID().longValue() == person.getLastPossibleID().longValue()) 
{ 
    person.setNewID (person.getFirstID()); 
} 

// add 1 to Old ID to get new ID 
syuncronized(this){ 
person.setNewID (bnkPrb.getNewID + 1); 
} 


return person; 
} 

jedoch BES t Ansatz, eine Spalte oder Sequenz auf Datenbankseite automatisch zu vergrößern.

+0

Danke einen Haufen. Ich verstehe jetzt :) – Aiden

+0

Frage, wenn ich Sequenz, nicht den Code synchronisieren, was, wenn eine Transaktion zurückrollt, wird es Lücken in der ID dann. Was, wenn ich sicherstellen muss, dass es keine Lücken in der ID gibt. – Aiden

+0

Brauchen Sie es wirklich, denn was auch immer Sie angehen, behindert es die Leistung. Da deine nächste Aktion warten muss, bis sie fertig ist. Selbst für die Synchronisierung müssen Sie die gesamte Methode synchronisieren. – Panther

Verwandte Themen