Derby/JavaDB Client-Server-Architektur mit Datenbank

bene2808

Aktives Mitglied
Hallo Forum,

ich bin an einem Projekt dran, bei dem sich mehrere Clients mit einem Server verbinden und Daten austauschen können. Da sehr viele Daten auftreten werden, soll der Server sowieso eine Datenbank verwenden. Der Client soll aber alle Daten die er schon einmal nachgefragt hat, selbst speichern, damit er ggf. auch ohne eine Verbindung zum Server arbeiten kann. Die Daten sind dann vielleicht nicht immer up to date, aber in diesem Projekt trotzdem absolut benutzbar.

Ich kenne die Grundlagen von relationalen Datenbanken, SQL; am Aufsetzen von Datenbanken und Verbinden über Java bin ich aber erst seit kurzem dran. Auf jeden Fall dürfen die Datenbanken von Clients und Server nicht komplett synchronisiert werden, weil der Server natürlich einige Details kennt, die der Client nicht wissen darf.

Eine Client-Server-Architektur mit java.net habe ich bereits aufgestellt (oder geht es für dieses Projekt auch einfacher?😵). Jetzt hänge ich im Moment an der Datenbank fest. Natürlich sollten die Datenbanken von Java aus komplett automatisch installiert werden können, da sie ja auch für die Clients gebraucht werden; hier bin ich auf Java DB (oder heißt das Oracle DB???) gestoßen, in einem Codebeispiel hat dieses automatische Erstellen auch ganz gut geklappt (gibt es trotzdem Alternativen?😵). Jetzt müsste ich eigentlich direkt über JDBC zugreifen (oder nicht?), aber das ist etwas unpraktisch. Ich habe aber vor Laaangem mal mit JPA gearbeitet und das war doch um einiges "platzsparender". Aber wie bringe ich jetzt JPA mit Java DB zusammen? Ich habe es zuerst mit der Glassfish-Implementierung versucht (Alternativen: Vor- und Nachteile?).

Nach langen Recherchen, als ich es endlich geschafft hatte, die persistence.xml richtig zu platzieren, wird aber immer noch der Treiber bei entityManagerFactory.createEntityManager() nicht gefunden. Vermutlich brauche ich sowieso einen anderen um mit Derby, Java DB oder was auch immer zu kommunizieren.😵

Mal wieder freue ich mich über jeden Hinweis 😀🙂
 
Wie sollen Client und Server denn kommunizieren? Über http (und Daten dann z als JSON) oder über Sockets und Binärdaten?
Wenn ersteres würde ich 'n FrameWork wie zB Spring Boot nutzen, damit lässt sich das recht leicht umsetzten, uns JPA ist direkt dabei (und ziemlich leicht zu benutzen). Komme aber drauf an, was genau gemacht werden soll...
 
Wow, schnelle Antwort🙂

Also... http ist doch vor allem zum Versenden von Dateien. Bei mir handelt es sich aber oft um recht kleine Datensätze (teilweise vmtl. nicht mal ein Kilobyte), die auch nicht in Form von Dateien vorliegen. Und JSON ist zwar für das Übertragen von Objekten, sendet den Inhalt aber zeichenweise oder? Klingt für mich auch relativ verschwenderisch. Da würde ich dann schon lieber die direkte binäre Variante mit Sockets nehmen, und etwas mehr Aufwand in Kauf nehmen. Die habe ich ja auch schon implementiert.

Aber wie kriege ich das jetzt mit der Datenbank zusammen?😕😵
 
Also... http ist doch vor allem zum Versenden von Dateien. Bei mir handelt es sich aber oft um recht kleine Datensätze (teilweise vmtl. nicht mal ein Kilobyte), die auch nicht in Form von Dateien vorliegen. Und JSON ist zwar für das Übertragen von Objekten, sendet den Inhalt aber zeichenweise oder? Klingt für mich auch relativ verschwenderisch. Da würde ich dann schon lieber die direkte binäre Variante mit Sockets nehmen, und etwas mehr Aufwand in Kauf nehmen. Die habe ich ja auch schon implementiert.

Wenn es schon implementiert ist, lohnt sich der Umstieg wahrscheinlich nicht...

In den meisten Fällen ist aber der Aufwand beim Umsetzen das wesentliche, und RESTful-Services gibts halt schon "fertig" als Framework (mit Datenbank, Server, Mapping von Daten in für den Client passende Repräsentation, etc).
"Verschwenderisch" ist es zwar, in den meisten Fällen ists aber völlig unerheblich, grad wenns nur Recht kleine Datensätze sind. Mit JSON lassen sich halt Objekte leicht abbilden (auch relationale Tabellen 😉), und sind dann auch Menschen-Lesbar. Ob's Dateien sind oder nicht ist unerheblich, es ist einfach nur eine textuelle Darstellung der Daten, die kann man natürlich auch in Latein speichern, muss man aber nicht.

Aber wie kriege ich das jetzt mit der Datenbank zusammen?😕😵
Damit können dir vermutlich andere besser helfen...
 
Ok dankeschön erstmal😀. Werde mir JSON und die Frameworks einfach mal genauer anschauen und versuchen, sie in eine Implementierung der Client-Server-Datenbank-Struktur einzubauen. Und falls die Kommunikation doch zu langsam wird, kann ich ja notfalls auch noch umsteigen.😎

Jetzt aber noch mal ein bisschen genauer zu JPA:

Code:
try {
            // Der Teil, der Java DB initialisieren soll
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            Connection connection = DriverManager.getConnection("jdbc:derby:DBTest;create=true");
            // Der Teil, der für JPA zuständig sein soll
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("QuickStart");
            EntityManager manager = factory.createEntityManager();
} catch (Exception ex) {
            ex.printStackTrace();
}

Leider tritt in der letzten Zeile im try-Block folgender Fehler auf:😕

Code:
[TopLink Info]: 2016.07.31 03:50:55.185--ServerSession(1371006431)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))
Local Exception Stack:
Exception [TOPLINK-4003] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Exception Description: Configuration error.  Class [sun.jdbc.odbc.JdbcOdbcDriver] not found.
    at oracle.toplink.essentials.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:101)
    at oracle.toplink.essentials.sessions.DefaultConnector.loadDriver(DefaultConnector.java:183)
    at oracle.toplink.essentials.sessions.DefaultConnector.connect(DefaultConnector.java:98)
    at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)
    at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
    at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280)
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
    at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
    at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)
    at startup.DBTest.main(DBTest.java:35)

Er sucht den JdbcOdbc-Treiber, aber brauche ich den für eine Verbindung zu einer Java DB-Datenbank überhaupt? Ich dachte der in der ersten Zeile des try-Blocks geladene Treiber wäre der richtige... Aber wie weise ich ihn jetzt an, den zu benutzen?😵
 
Hey die Bibliothek scheint echt cool zu sein🙂.

Aber Datenbank-Zugriff ist da nicht dabei, oder?😕

Ich bin totaler Anfänger mit Datenbanken... Hier muss doch irgendwer wissen, wie ich eine Java DB Datenbank über JPA anspreche...😱🙄
 

Zurück
Oben