Forum: PC-Programmierung [JDO + MySQL] Einen zähler implementieren


von Mampf (Gast)


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

: Verschoben durch Admin
von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

UPDATE xyz SET z=z+1

von Mampf (Gast)


Lesenswert?

Andreas Schwarz schrieb:
> UPDATE xyz SET z=z+1

Update wird leider nicht von Datanucleus unterstützt ... Das muss leider 
anders gehen ...

Eine Query, die mit etwas anderem als "SELECT" anfängt, wirft eine 
Exception:"Query must start with SELECT" oder so ähnlich ...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

SELECT * FROM (UPDATE xyz SET z=z+1);

;P Müßte eigentlich die Anzahl geänderter Zeilen zurückliefern (ggf. das 
FROM weg oder so... hab gerade kein MySQL Server um das zu testen)

von Peter (Gast)


Lesenswert?

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)

von Mampf (Gast)


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

von Peter (Gast)


Lesenswert?

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

ok, ich habe jetzt zu ende gelesen.

in mysql gibt es doch auto_ident, abfragen kannst du es mit 
LAST_INSERT_ID()

von koarl (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.