# Speicherkonzept



## tomier (18. Sep 2012)

Liebe Leute,

Ich bin am entwickeln für ein kleines ERP-System für den familiären Landwirtschaftsbetrieb mit paar betriebsspezifischen Extras und einer "Steuerungsapp".

Meine Frage ich nun folgende:

Ich will prinzipiell alles in einer Online-MySQL-Datenbank speichern.
Nur was wenn die Internetverbindung ausfällt? 
Da wäre meine Idee immer das ganze in eine lokale MySQL-Datenbank zu speichern und bei erneuter Internetverbindung wieder zu synchronisieren. (Wie kann ich das machen, wie kann ich mit java die Datenbank immer auf den zeitlich letztgültigen Stand abgleichen?)

Was ist aber wenn die lokale Datenbank ausfällt? Dann muss man auch arbeiten können.
Es handelt sich um Artikel-, Lieferschein-, Rechnungs-,Auftragsdaten etc. - also einfache Text und Zahlendaten. 
Was wäre die dritte sicherste Backuplösung? Ein Textfile?

Also ich dachte an eine Reihenfolge wie:
1. wird in Textfile gespeichert 
2. zeitgleich in lokale Datenbank
3. Bei schließen gewisser fenster (teilbereiche des ERP z.b lieferscheinverwaltung) wird es mit online datenbank synchronisiert (bitte eine Idee nur zu ner Quelle wo ich das finde, kann google anscheinend nicht die richtige frage stellen).

Bitte um viele Ideen und gute Praxiserfahrungen.

LG
tomier


----------



## tfa (18. Sep 2012)

Statt einer lokalen MySQL würde ich lieber eine (embedded) Java-DB verwenden, z.B. H2. Damit sparst du dir das Textfile. Die Synchronisation mit der globalen DB musst du dann eben programmieren.


----------



## Swoop (18. Sep 2012)

Solche Datenbankabgleiche werden auch Replikation genannt. Vllt hilft dir was wenn du danach suchst !


----------



## tomier (18. Sep 2012)

Aber muss ich aus der H2 -DB dann irgendwie für die Online-DB "übersetzen"? Also so als würde ich direkt die Daten aus der Anwendung in die DB speichern?

Ist die H2 auch sehr ausfallssicher? Also stürzt die erst ab wenn da Programm abstürzt?

LG


----------



## tfa (18. Sep 2012)

> Aber muss ich aus der H2 -DB dann irgendwie für die Online-DB "übersetzen"?


Was willst du denn übersetzen? Das sind beides SQL-Datenbanken, die sich per JDBC ansprechen lassen. Wenn du inkompatible Features benutzt, musst du natürlich aufpassen. Ich würde aber eh einen Application-Server vor die globale Datenbank schalten und den Client damit kommunizieren lassen. 



> Ist die H2 auch sehr ausfallssicher? Also stürzt die erst ab wenn da Programm abstürzt?


Wenn sie embedded ist, läuft sie in der selben VM wie dein Programm.


----------



## tomier (18. Sep 2012)

tfa hat gesagt.:


> Was willst du denn übersetzen? Das sind beides SQL-Datenbanken, die sich per JDBC ansprechen lassen. Wenn du inkompatible Features benutzt, musst du natürlich aufpassen. Ich würde aber eh einen Application-Server vor die globale Datenbank schalten und den Client damit kommunizieren lassen.


Puhh mit Application-Server muss ich sagen, fange ich begriffsmäßig nicht viel an. Mit davor schalten meinst du auf welchem Rechner soll dieser Application-Server laufen? 
Die Wikipedia-Definition hilft mir auch nicht weiter: "Ein Server, welcher Dienste Clients zur Verfügung stellt."

Kannst du mir das bitte genau erklären was du damit meinst? Du klingst als hättest du sowas schon gemacht - nur ich hab vom Aufbau und vor allem welchen Application-Server leider keine Vorstellung was das genau ist, wie man es verwendet, wo man welche Komponente laufen lässt..etc.



tfa hat gesagt.:


> Wenn sie embedded ist, läuft sie in der selben VM wie dein Programm.



Wie mache ich Sie embedded?


----------



## F.S.WhiTeY (18. Sep 2012)

Moin,

Ein Applikations-Server ist laut definition erstmal ein Verbund aus mehreren Komponenten. Z.B. der Verbund aus Servlet-Container und Datenbankserver. 

Also eigentlich ist es eher richtig zu sagen das die Datenbank und deren Server ein Teil des Apllikationsservers ist. 

Was tfa allerdings meint ist soetwas wie glassfish, JBoss oder Tomcat (wobei Tomcat kein wirklicher Applikations-Server ist, eben weil er nur aus dem Servlet-Container besteht.)

Was ein Servlet ist, kannst du googlen und die Möglichkeit der Kommunikation besteht im Einfachsten fall aus HTTP-Anfragen an den server. 

Ich rate dir allerdings dich mal mit TCP/IP in Java auseinander zu setzen. Dann kannst du dir deinen eigenen "Server" schreiben.

Damit würde der Applikationserver wegfallen und du lernst eine Menge über Netzwerke dazu


----------



## tfa (18. Sep 2012)

Dein Java-Programm (der Client) schreibt die Daten nicht per SQL direkt, sondern kommuniziert mit einem Server-Programm (Applicationserver). Der Server schreibt und liest die Datenbank. Man redet auch von Dreischichtarchitektur. Für die Kommunikation gibt es verschiedene Standards: RMI, Webservices, HTTP-Invoker etc. 
Das ist natürlich nicht so einfach wie ein 2-Schicht-Fat-Client; ich weiß nicht, wieviel Zeit und Lust du hast, dich damit zu beschäftigen, oder wie professionell die Lösung sein soll. Mit dem alten Weg kommst du schneller zum Ziel.



> Wie mache ich Sie embedded?



Hier findest du alle Informationen:
Tutorial


----------



## tfa (18. Sep 2012)

"Applicationserver" war vielleicht etwas schlecht ausgedrückt. Es reicht auch ein simples Java-Programm (z.B. mit Spring), das als Server fungiert. Da braucht man nichtmal einen Tomcat.



> Ich rate dir allerdings dich mal mit TCP/IP in Java auseinander zu setzen. Dann kannst du dir deinen eigenen "Server" schreiben.
> Damit würde der Applikationserver wegfallen und du lernst eine Menge über Netzwerke dazu


Er könnte sich auch mit der Dotierung von Halbleitern beschäftigen. So kommt er zwar auch nicht zum Ziel, lernt aber eine Menge über Festkörper-Physik.


----------



## Templarthelast (18. Sep 2012)

Man kann ja seine Datenbank auch auf eine Cloud wie z.B. von xeround legen, dabei wird die Datenbank an sich auf mehreren Servern gespeicherst, sodass sie (fast) immer garentiert erreichbar ist. Das Nachteil ist dabei, dass es etwas mehr kostet, aber man bekommt auch kleinere Testserver für umsonst.


----------



## tfa (18. Sep 2012)

Templarthelast hat gesagt.:


> Man kann ja seine Datenbank auch auf eine Cloud wie z.B. von xeround legen, dabei wird die Datenbank an sich auf mehreren Servern gespeicherst, sodass sie (fast) immer garentiert erreichbar ist. Das Nachteil ist dabei, dass es etwas mehr kostet, aber man bekommt auch kleinere Testserver für umsonst.



Das nützt aber auch nichts, wenn du kein Netzwerk hast. Ich denke, dieser Fall tritt hier eher ein, als eine kaputte DB.


----------



## Templarthelast (18. Sep 2012)

tfa hat gesagt.:


> Das nützt aber auch nichts, wenn du kein Netzwerk hast. Ich denke, dieser Fall tritt hier eher ein, als eine kaputte DB.



Dann kann ich ja notfalls eine Verbindung über Sateliten bereithalten. Es gibt einfach Situationen, die eintreten können. Als Spedition gehen mir auch manchmal meine LKWs kaputt und ich kann es nicht vollständig verhindern. Es ist die Frage wie weit ich es mit der Verfügbarkeit halten soll/muss.


----------



## tomier (18. Sep 2012)

Danke erstmal für die zahlreichen Antworten.

Na ja die Lösung soll schon professionell sein, aber NUR das notwendigste können.

TCP/IP auf Java muss ich mir näher aneignen,m ein Wissen über Netzwerke und das Protokoll  ist meines erachtens nach ausreichend.

Zur Erklärung ein Teil dieser ERP-Lösung ist eine Lieferscheinerstellung und verwaltung, welche eben zwischendurch lokal in der H2 abgespeichert werden kann. Diese MUSS immer funktionieren, ohne hat auch alle Artikeldaten lokal in der H2 gespeichert.

Diese ERP-Lösung wird auf mehreren PCs installiert, wobei je nach PC immer unterschiedliche Teile praktisch genutzt werden.

Der Operativbetrieb innerhalb eines Tages funktioniert auch ohne Netzwerk. Bei erneuter Konnektivität sollte es dann wieder gehen.

Aber wo installiere ich den Anwendungsserver? Ich kaufe eine Domain mit Webspace, Datenbank und was brauche ich noch dazu das ich einen solchen Anwendungsserver verwenden kann?

@tfa: Du meinst so etwas wie der Spring sollte reichen? Für meine Anforderung?


----------



## tfa (18. Sep 2012)

> @tfa: Du meinst so etwas wie der Spring sollte reichen? Für meine Anforderung?


Naja, es würde funktionieren. Trotzdem würde ich es mindestens auf einem Tomcat laufen lassen, schon weg Infrastruktur.


----------



## The_S (18. Sep 2012)

Muss das Teil im Internet stehen? Wäre nicht ein interner Server sinnvoller? Oder ist der Betrieb so weit "zerstreut"? Ansonsten musst du deinen Server, der ja öffentlich im Internet steht und dort auch Anfragen entgegennehmen kannst, gut gegen Angriffe absichern. Da du keine Ahnung von Application-Servern hast, sollte sich das als eher schwierig gestalten.

Ein weiterer Vorteil, wenn der interne Server nicht mehr erreichbar ist, wäre, dass dann in der Regel einfach ein Kabel oder ähnliches locker ist. Jedenfalls bist du nicht mehr auf das Wohlwollen deines Internet-Providers und deines Server-Vermieters angewiesen.


----------



## tomier (18. Sep 2012)

Das stimmt, nur eine Smartphone-APP soll die Daten davon empfangen und auch im Ausland verfügbar sein.


----------



## Gast2 (18. Sep 2012)

Dann mach das ganze lieber im Heimnetz Lokal und lass dein Smartphone eine VPN Verbindung ins Heimnetz aufbauen.


----------



## tomier (20. Sep 2012)

Das finde ich ist eine gute Idee:

Nur für den internen Server: 
Welche Datenbank sollte ich auf dem internen Server nehmen und wie synchronisier ich diese mit H2? (Habe meine bisherigen Sachen schon auf H2 umgestellt)


----------



## The_S (20. Sep 2012)

Kannste prinzipiell nehmen was de willst. Auch ne H2 kann man im Servermodus laufen lassen. Je nach Budget, ggf. benötigten speziellen Funktionen (denke mal eher nicht) und Transaktionsaufkommen gibt es unterschiedliche Empfehlungen. Aber für nen kleinen Familienbetrieb mit (denke mal) wenigen Benutzer, sollte es wirklich auch eine H2 im Servermodus tun.


----------



## tomier (20. Sep 2012)

Bis zu welcher Benutzer und Datenmengen bzw. Sätzen ist das empfehlenswert?

Aber trotzdem ich lasse die H2 einerseits auf jedem Gerät embedded laufen - bezüglich Ausfallssicherheit - und will diese dann mit einem zentralen Server abgleichen von dem sich jedes Gerät die Daten holt und dann speichert.

Wie mache ich diesen Sync?


----------



## The_S (20. Sep 2012)

tomier hat gesagt.:


> Bis zu welcher Benutzer und Datenmengen bzw. Sätzen ist das empfehlenswert?



Umgekehrt gefragt, wie viel willste denn verwalten? Ist halt auch immer ne Sache des Supports. Bekommste bei ner IBM DB2 sicherlich mehr als bei ner H2. Dafür isses halt auch bissal teurer  .



tomier hat gesagt.:


> Aber trotzdem ich lasse die H2 einerseits auf jedem Gerät embedded laufen - bezüglich Ausfallssicherheit - und will diese dann mit einem zentralen Server abgleichen von dem sich jedes Gerät die Daten holt und dann speichert.



Halte ich persönlich für übertrieben. Ich kenne kein einziges Unternehmen (ich arbeite momentan in einem > 5000 Personen Unternehmen) das das so handhabt.


----------



## freez (20. Sep 2012)

tomier hat gesagt.:


> Aber trotzdem ich lasse die H2 einerseits auf jedem Gerät embedded laufen - bezüglich Ausfallssicherheit - und will diese dann mit einem zentralen Server abgleichen von dem sich jedes Gerät die Daten holt und dann speichert.
> 
> Wie mache ich diesen Sync?



Wozu das denn noch, wenn du es innerhalb der Firma laufen lässt? Also ganz ehrlich ... ich kenne Lösungen, wo ein Standort im Ausland übers WAN an Server in Deutschland angebunden sind. Und wenn die Verbindung abreist steht eine komplette Produktionshalle. Und hier erreicht man auch über 99,9% Verfügbarkeit. Meinst du nicht, dass es reicht, wenn alle Clients mit einem SQL Server reden ohne den ganzen Sync? Was ist das denn für ein schlechtes internes Netzwerk?

Im schlimmsten Fall hast du in deinem Sync Bugs und erreichst vielleicht eine geringere Verfügbarkeit als eine direkte Anbindung über das Intranet.


----------



## tomier (21. Sep 2012)

@freez:

Schau ein PC hängt per WLAN drinnen, wenn bei dem die Verbindung abreißt und der kann gar nicht mehr arbeiten (und genau der steht in der Produktionshalle) ist die Hölle los.

@The_S: und wie geht die Firma wo du arbeitest damit um? Was ist wenn ein LAN-Segment ausfällt?


----------



## Gast2 (21. Sep 2012)

tomier hat gesagt.:


> @The_S: und wie geht die Firma wo du arbeitest damit um? Was ist wenn ein LAN-Segment ausfällt?



Auch wenn ich nicht gefragt war: Wenn man eine sichere Netzverbindung braucht nimmt man kein WLan ...


----------



## tfa (21. Sep 2012)

Ich finde das auch überhaupt nicht ungewöhnlich. Für mein aktuelles Projekt mussten wir auf Kundenwunsch auch einen "Offline-Modus" implementieren, damit die Software auch ohne Netz funktioniert. Z.B. in Produktionshallen ohne WLAN oder an ausländischen Standorten mit schlechter Infrastruktur. Leider wurde die lokale Datenhaltung mit XML-Dateien gelöst statt einer DB. Damals waren die Java-DBs noch nicht so weit. Heute würden wir das sicherlich anders machen.

Davon abgesehen ist das das ganz gewöhnliche Workspace-Repository-Prinzip, und das kennt ja wohl jeder.


----------



## The_S (21. Sep 2012)

tomier hat gesagt.:


> @The_S: und wie geht die Firma wo du arbeitest damit um? Was ist wenn ein LAN-Segment ausfällt?



Wenn das LAN nicht funktioniert, dann ist das nicht das Problem der Entwicklung sondern der (Netzwerk-)Administration.

Bei einfachen Sachen kann man sicher eine Offline-Lösung anbieten. Aber bei komplexen Programmen, bei denen bspw. mehrere Mitarbeiter einen Datensatz bearbeiten, Daten weiterverarbeitet werden, ... (wie es bei einem ERP der Fall ist), dann wird das doch sehr komplex. Du müsstest dann selbst die Integrität der Daten sicherstellen, und das ist garantiert nicht einfach. 

Angenommen Mitarbeiter A verändert Datensatz z. Das Programm stellt fest, dass keine Verbindung zur DB besteht und speichert den Datensatz lokal ab. In der Zwischenzeit verändert Mitarbeiter B, der noch über eine Datenverbindung verfügt, ebenfalls Datensatz z. Mitarbeiter A hat dann wieder Zugriff auf die globale Datenbank und möchte Datensatz z synchronisieren. Wie gehst du vor? Wird die Änderung von B überschrieben? Wird die Änderung von A verworfen? Merkst du dir die Änderungen von A und B an z und versuchst die Datensätze dann irgendwie zu mergen? Selbst wenn dir letzteres gelingen sollte, was wenn B den Datensatz gar nicht verändert hätte (weil falsch), wenn er die Änderungen von A gesehen hätte? Und das ist noch ein sehr einfaches Szenario. Berücksichtigen musst du auch, dass bei einem Ausfall der Verbindung auch keine Daten auf den lokalen Rechner kommen können. Also außer neu anlegen von Datensätzen ohne Abhängigkeiten (wohl ein eher seltener Fall) geht ohnehin gar nichts. Es sei denn du hältst die komplette DB in lokaler Kopie 

Ich glaube nicht, dass es sich - rein wirtschaftlich betrachtet - lohnt, Offline-Funktionalität bereitzustellen. Das erfordert, wenn die Integrität der Daten sichergestellt werden soll, sehr hohe Anforderungen an das Programm. Und Fehler bei der Synchronisation sind meistens deutlich teurer, als wenn der Mitarbeiter in der IT-Abteilung anruft und bescheid gibt, dass sein (W)LAN nicht funktioniert. Letzteres muss nämlich sowieso gefixt werden und sollte bei einer einigermaßen gut aufgebauten Infrastruktur weder teuer noch zeitaufwendig sein.


----------



## freez (21. Sep 2012)

The_S hat gesagt.:


> Ich glaube nicht, dass es sich - rein wirtschaftlich betrachtet - lohnt, Offline-Funktionalität bereitzustellen. Das erfordert, wenn die Integrität der Daten sichergestellt werden soll, sehr hohe Anforderungen an das Programm. Und Fehler bei der Synchronisation sind meistens deutlich teurer, als wenn der Mitarbeiter in der IT-Abteilung anruft und bescheid gibt, dass sein (W)LAN nicht funktioniert. Letzteres muss nämlich sowieso gefixt werden und sollte bei einer einigermaßen gut aufgebauten Infrastruktur weder teuer noch zeitaufwendig sein.



Darauf wollte ich eigentlich auch hinaus. Ich will dir das nicht madig machen oder so, sondern nur aufzeigen, dass du dir da schon ordentlich was aufhalst. Da sollte man tatsächlich mal prüfen, ob es nicht günstiger wäre eine Netzwerkleitung zu dem PC zu ziehen ... soll heissen, wenn man schon eine netzwerkbasierte Anwendung im Betrieb einsetzen möchte, sollte man auch eine stabile Netzwerkinfrastruktur bereitstellen.


----------



## ssoul26 (21. Sep 2012)

Wenn du alles selber programmieren willst, würde ich es so machen: 

Sofern die DB nur von der selben Einrichtung angesprochen wird, welche über einen zentralen Internetausgang auf die Online-DB zugreifen, spricht eigentlich nicht viel gegen eine zusätzliche Offline-Version. Protokolliere die getätigten Veränderungen in einer zusätzlichen Tabelle als SQL-Anweisungen. Überschreibe hier einfach die Zugriffselemente evtl. JDBC-Klassen etc. Sprich die Datenbanken parallel an, sollte eins Ausfallen protokollierst du dies mit einem timestamp und machst einfach weiter. Deine Sync-Routine guckt dann periodisch nach einem Ausfall und -falls registriert- werden die Protokollierten Anfragen, ab Zeitstempel des Ausfalls, in ein SQL-Skript gepackt und über Nacht oder Tag als Update-Skript auf der jeweiligen Datenbank ausgeführt.


----------



## freez (21. Sep 2012)

The_S hat gesagt.:


> Angenommen Mitarbeiter A verändert Datensatz z. Das Programm stellt fest, dass keine Verbindung zur DB besteht und speichert den Datensatz lokal ab. In der Zwischenzeit verändert Mitarbeiter B, der noch über eine Datenverbindung verfügt, ebenfalls Datensatz z. Mitarbeiter A hat dann wieder Zugriff auf die globale Datenbank und möchte Datensatz z synchronisieren. Wie gehst du vor? Wird die Änderung von B überschrieben? Wird die Änderung von A verworfen? Merkst du dir die Änderungen von A und B an z und versuchst die Datensätze dann irgendwie zu mergen? Selbst wenn dir letzteres gelingen sollte, was wenn B den Datensatz gar nicht verändert hätte (weil falsch), wenn er die Änderungen von A gesehen hätte? Und das ist noch ein sehr einfaches Szenario. Berücksichtigen musst du auch, dass bei einem Ausfall der Verbindung auch keine Daten auf den lokalen Rechner kommen können. Also außer neu anlegen von Datensätzen ohne Abhängigkeiten (wohl ein eher seltener Fall) geht ohnehin gar nichts. Es sei denn du hältst die komplette DB in lokaler Kopie



Vielleicht noch ein Hinweis dazu, falls du an deiner Sync Variante festhälst: Du kannst es dir natürlich auch etwas einfacher machen und bei einem Ausfall keine Änderungen zulassen (SQL UPDATE). Neue Daten anlegen und bestehende Daten anzeigen kannst du dagegen schon zulassen, da die weniger kritisch sind und von anderen Mitarbeitern nicht verändert werden können. Du hast aber immer noch das Problem, dass du falsche Daten anzeigst, falls ein Mitarbeiter mit Verbindung die Daten verändert.


----------



## tomier (21. Sep 2012)

Vielen Dank für die vielen möglichen Problemstellungen.

Es ist weniger kritisch, dass die Daten aus der Produktionshalle nicht auf den anderen Rechner übertragen werden, als wenn dieser gar nicht arbeiten kann. Lieferscheine müssen ausgefertigt werden, Lagerbestände eingegeben. Darin wird der Produktivbetrieb erfasst - das ist wichtig für die Planung des nächsten Tages.
Wenn die Daten nicht auf den Server und somit auf den PC des Betriebsleiters (mein Vater) landen ist das weniger schlimm, dann liest man es (falls das Problem noch immer nicht behoben) am Produktionshallen-PC.

Für unseren Betrieb rentiert sich das nicht wirklich. Das aufgraben und stämmen würde aufgrund massivem Beton usw. eine 5-stellige Summe übersteigen und das steht für ein LAN-Kabel nicht wirklich.

@tfa: Workspace-Repository-Prinzip ist mir nur in Form von fertigen Lösungen für Arbeitsdokumente ein Begriff.


----------



## TheDarkRose (23. Sep 2012)

tomier hat gesagt.:


> Für unseren Betrieb rentiert sich das nicht wirklich. Das aufgraben und stämmen würde aufgrund massivem Beton usw. eine 5-stellige Summe übersteigen und das steht für ein LAN-Kabel nicht wirklich.



Ich sag nur kabeltrassen. Kenne keine produktionshalle, dies Kabel unter Putz verlegt.

Gesendet von meinem GT-I9000 mit Tapatalk 2


----------



## FArt (24. Sep 2012)

Man sollte sich immer eines überlegen: ist ein einfaches Konzept nicht einem komplexen vorzuziehen? Ist ein gewisser Ausfall, der in der Regel selten vorkommt, nicht hinnehmbar, besonders wenn man mal eine Kosten-Nutzen-Rechnung anstellt?

Ich habe schon viele Konzepte mit DB-Replikation, Ausfallsicherheit usw. gesehen und bewertet. Die Kunden waren immer der Meinung, so etwas wäre unbedingt benötigt. Das Gefühlt trügt in der Regel. Eine notdürftige Internetverbindung (z.B. über das Handy) ist in deinem Fall besser als hochtrabende, technisch anspruchsvolle Konzepte.


----------

