mikrocontroller.net

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


Autor: Mampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UPDATE xyz SET z=z+1

Autor: Mampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Mampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: koarl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/sto...


koarl

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.