# Kleines Aktienspiel, Problem: Persistenz



## lohr (28. Mai 2008)

Hallo,


Also ich habe ein kleines Client - Server Spiel entworfen, der Server soll eigentlich nur die LoginDaten managen, zusätzlich die Aktien und ihre Kurse.
Der Client kann sich einloggen, soll seine Aktien angezeigt bekommen und die die noch verfügbar sind mit den Kurswerten(das ganze erstmal auf Textbasis, Grafik kommt später, alles schön schrittweise^^).
Nun mein Problem, zur Zeit spiele ich damit rum die Objekte in normale Dateien (txt) zu mappen, welches ich selben im Konstruktor der jeweiligen Klassen tue. Ich schätze mal das dies einfach nicht Gang und Gebe ist und würde mich interessieren welche Verfahren es noch gibt.
Beziehungsweise meint ihr das mein Server mit der ganzen Filehandling Sache ziemlich schnell "down" geht?
Er ist Multi Threaded programmiert (jeder Login bekommt seinen eigenen Thread).

Würde mich über eure Antworten und Tipps freuen.


Gruß Alex


----------



## DamienX (28. Mai 2008)

Hallo!

Die Frage habe ich mir auch einmal gestellt und ich kann dir nur empfehlen NICHT
die Serialisierung zu wählen.

Der Hauptgrund ist die serielle ID... solltest du irgendetwas an deinem alten "Dateiformat" ändern
stimmen die Checksums nicht mehr zusammen. Damit musst du die Methoden zum schreiben
und lesen ändern und zusätzlich sind (zumindest bei ObjectStreams) deine gesammelten Daten auch
Schrott.

Ich habe daraufhin eine Embedded Datenbank benutzt... 
HSQLDB glaub ich war das! MySQL Lite ist glaub ich auch was in der Richtung.

Grüße Alex


----------



## lohr (28. Mai 2008)

Danke für die fixe Antwort.
Also aus der Richtung hab ich das ganze noch gar nicht gesehen...Was ich aber noch nicht ganz verstehe, die serielle ID bleibt ja immer gleich(sollte sie^^), jedenfalls in einem Lebenszyklus des Obejktes, warum verändert sich dann die Checksumme(sollte man die Dateistruktur ändern, müßte man doch zwangsweise "nur" einen Server Restart machen der dann die Objekte anhand der neuen "Regeln" mapped).

Werd mir mal die embedded SQL Dinger anschauen, was genau hab ich darunter zu verstehen?

Gruß Alex


----------



## DamienX (28. Mai 2008)

Die Sache ist die:

Wenn du Objekte in Dateien schreibst bekomm diese eine serielle ID zugewiesen...
Solltest du jetzt in deine Klasse ein neues Feld einfügen (was durchaus denkbar ist)
stimmt deine Klasse nicht mehr mit dem Objekt in der Datei zusammen und du wirst deine 
Daten nicht mehr lesen können... 

könnte mir vorstellen dass man dies umgehen kann indem man bei jeder Änderung des Klasse
die Klasse neu ableitet und dann die Alte konvertiert aber das wär mir persönlich zu umständlich.

Embedded DBs sind nix anderes als Datenbanken für die du keine Server brauchst.... 
Das heisst du verbindest deinen Server mit einer DB (muss auch nich unbedingt embedded sein)
und schreibst da deine Daten rein. Nebenbei hast du den Vorteil dass dein DBMS auf deine Daten 
aufpasst.


----------



## ARadauer (28. Mai 2008)

> Also ich habe ein kleines Client - Server Spiel entworfen


was spricht gegen eine mysql datenbank?

ich als webentickler zb hab sowieso xampp drauf, verwende für solche testsachen immer meine mysql db


----------



## DamienX (28. Mai 2008)

Ich weiß nicht wie weit du dich mit DB-Systemen auskennst aber falls du nicht viel Erfahrung
damit hast:

- sich in DB-Systeme und SQL einzuarbeiten mag ein Aufwand sein...
- aber wenn du einmal Datenbanken designen und einrichten kannst ist
das für komplexe Anwendungen eine seeehr gut genutzte Investition
deiner Zeit

Ein kleiner Tip vllt...
such dir wenn du in Datenbanken nicht bewandert bist ein einsteigerfreundliches System..
MySQL zb... da es hier viele Tutorials gibt. Die SQL Dialekte wandern auch leicht auseinander!

Ich benutze Oracle... liegt aber daran dass ich beruflich damit zu tun habe!

Grüße Alex


----------



## maki (28. Mai 2008)

Warum MySQL?

Hat eine der größten Abweichungen vom SQL Standard, in der Standard Konfiguration werden nicht mal Relationale Tabellen erzeugt sondern MyISAM Schrott... gibt doch soviele freie *R*DBMS...


----------



## DamienX (28. Mai 2008)

Gut bin mit MySQL noch nicht wirklich in kontakt gekommen aber wenn du das sagst glaub ich dir das =)


----------



## lohr (29. Mai 2008)

Okay also ihr habt mich überzeugt.
Was benötige ich dafür alles?
Ich schätze mal ab:
- Eine SQL Datenbank (zb MySQL)
- Treiber?
- zusätzliche API?

Hätte jemand noch ein gutes Tutorial?
Vielen Dank für eure Hilfe schonmal und wenn ich mit SQL auf die Fresse falle seid ihr schuld ^^

Gruß alex


----------



## DamienX (29. Mai 2008)

Hier der Artikel:

http://www.galileocomputing.de/open...22_001.htm#mj2fcd0f3478c5d311ea4f6aea90175960

JDBC heisst das Stichwort...
In dem Java Insel Artikel wird das (leider zwar leicht oberflächlich) eigentlich schön erklärt.
Hier wird auch HSQLDB benutzt.

Du brauchst:
- die JDBC API + Driver (je nach Datenbanksystem)
- ein DBMS (Database Management System) ... quasi deine Datenbankplattform
- paar SQL Grundkenntnisse

Sieht schlimmer aus als es ist...


----------



## lohr (29. Mai 2008)

Also jungs vielen Dank für eure Hilfe 
Ich werd mich übers Wochenende mal dransetzen und euch dann mal am Laufenden halten, hoffe mal das funzt alles


----------



## lohr (2. Jun 2008)

So jungs, also das mit SQL war nen super tipp, ist leichter als gedacht ^^
Arbeite jetzt mit MySQL, JDBC und phpmyadmin.

Ich hätte ne kurze Design Frage.
Würdet ihr bei einer Client - Server Anwendung nur dem Server Zugriff auf die SQL Daten erlauben oder würdet ihr auch den direkten Zugriff vom Client zur Datenbank erlauben?

Client Anfrage -> Server -> SQL -> Server -> Client Antwort
Client Anfrage -> SQL -> Client Antwort

Durch die zweite Lösung hätte ich halt das Problem das ich das SQL Passwort in einer Klasse speichern muss die dem User mitgegeben wird...


----------



## Gast (4. Jun 2008)

mal abgesehen von dem sicherheitsproblem, bleibst du wesentlich flexibler, wenn die clients nur mit deinem applikations server kommunizieren und nicht direkt mit der datenbank.


----------



## Chimaira (5. Jun 2008)

in einem Spiel werden aber keinen vertraulichen Daten verwendet. Somit ist ein Sicherheitsproblem primär nicht wichtig.

Mfg Chimaira


----------



## Gast (6. Jun 2008)

Den Client direkt mit der Datenbank komunizieren lassen würd ich nicht machen. 
Oder wie soll das laufen wenn zwei Clients auf die selben Daten schreibend zugreifen?


----------



## DamienX (6. Jun 2008)

Nein von direkten Datenbankzugriffen der Client Seite kann ich dir nur abraten.
Jeder normale Mensch der auf diesem Gebiet arbeitet würde dir das gleiche erzählen.

Frag die Daten am Server ab und gib sie an den Client weiter. Das is zwar ein Aufwand
aber so läuft der Prozess gesteuert ab.

Dass verschiedene Benutzer auf die gleichen Daten zugreifen wollen passiert auf großen
Systemen ständig. Das ist solange unkritisch bis du Transaktionen offen lässt.

Kurze Erklärung:

Wenn du eine Transaktion öffnest (UPDATE, INSERT INTO etc.) sperrt dein DBMS die
Daten für andere Zugriffe. Diese Sperre löst sich sobald du die Änderungen commitest oder 
einen Rollback machst. 

Tipp: Egal wann und wieso du deine Daten auf der DB änderst...
Sollte EGAL WO ein Fehler aus welchen gründen auch immer auftauchen ist
das erste was du tust einen Rollback zu machen.

Solltest du zb eine MessageBox als hinweiß vor den Rollback stellen und 
der jenige welcher die MessageBox erhält nicht "wegdrückt" bleibt der Datensatz einfach gesperrt
und niemand kann auf die Daten und Referenzen des Datensatzes zugreifen.

Grüße


----------



## lohr (9. Jun 2008)

Ok vielen Dank für eure Antworten!
Sowas in der Richtung hab ich mir schon gedacht...wollte gerne noch eure Rat hören 

Was mich weiter zur Datenbank Architektur bringt.
Also ich habe folgendes Modell vor:

*Datenbanken*
User
_Enthält die Login-Informationen wie allgemeine Sachen(Geld, Erstellungsdatum, email, nick, pw...)_
xxxxx_Aktien
_Nun möchte ich für jeden neuen User eine eigene Tabelle anlegen mit dem Namen: Nick_Aktien._

Somit ist eine Datenbank alleine für die Account Daten verantwortlich die anderen für die Aktien des Users. Kann man das so machen?
Mein Problem war das ich nicht weiß wieviele Aktien ein einzelner User hat und somit kann ich keine Felder wie "Aktie1" "Aktie2"...in der User Tabelle mitaufnehmen.

Gruß lohr


----------

