[JDO + MySQL] Einen zähler implementieren

Gast #1867159
Lesenswert?

Guten Morgen :)

bestimmt jeder kennt das Problem, dass multithreaded einen Zähler zu 
inkrementieren, nicht ganz trivial ist.

Dafür gibt es normalerweise Mutexe oder Synchronisierte Methoden, die 
immer nur einen Thread erlauben, einen Wert zu lesen, zu inkrementieren 
und zurückzuschreiben.

Mein Problem ist jetzt, dass ich einen Zählerstand in einer Tabelle in 
meiner MYSQL Datenbank habe, der von mehreren Threads aus inkrementiert 
und zurückgeliefert werden müsste. Zwischen einer Query nach dem 
Zählerstand und dem Inkrementieren könnte ein anderer Thread das Gleiche 
tun, was dann Inkrements verlieren würde.

Ich verwende Java + JDO + Datenucleus + MySQL.

Sowas wie "INSERT ... ON DUPLICATE KEY UPDATE ..." wird von 
JDO/Datanucleus nicht unterstützt, das müsste also anders gehen.

Hat da zufällig jemand eine Idee, wie man das machen kann?

MfG
Mampf
Gast #1867474
Lesenswert?

Peter schrieb:
> Mampf schrieb:
>> estimmt jeder kennt das Problem, dass multithreaded einen Zähler zu
>> inkrementieren, nicht ganz trivial ist.
>
> so ist das problem, such mal nach
>
> InterlockedIncrement
>
> (gibt es auch für linux)

Vielen Dank, dass du dir die Zeit genommen hast, die ersten 2 Zeilen zu 
lesen ... ;-)

Grüße,
Mampf
Gast #1869783
Lesenswert?

Mampf schrieb:
> Ich verwende Java + JDO + Datenucleus + MySQL.
>
> Sowas wie "INSERT ... ON DUPLICATE KEY UPDATE ..." wird von
> JDO/Datanucleus nicht unterstützt, das müsste also anders gehen.
>
> Hat da zufällig jemand eine Idee, wie man das machen kann?

hm.. du hast einen mapping layer, der dich nur selects selbst machen 
lässt?
dann sollte der das irgendwie handlen können.

alternative idee:
pseudo-sequences mit stored procedures:
http://www.mysqlperformanceblog.com/2008/04/02/stored-function-to-generate-sequences/


koarl

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren