Embedded DB für Java

cpu32

Mitglied
Hallo zusammen,

ich bin vor einigen Tagen von VB.Net auf Java umgestiegen und komme mit der "neuen" Sprache auch prima zurecht! Nun möchte ich in ein Programm aber eine Datenbank einbetten. Mein Ziel ist es eine SQL-Server-Datenbank die ich vor einiger Zeit(also noch für VB.Net) mit dem SQL Server Express Managment Studio erstellt habe in das neue Java Programm so einzubinden, dass sowohl die eigentliche Datenbank als auch die entsprechend benötigten Treiber in der .jar-Datei "verschwinden", also komplett eingebettet sind. Versucht habe ich mich bereits an JavaDB alias durby. Die einzubettende DB ist recht klein(max. 5MB) Als IDE benutze ich übrigens Eclipse.
Vielleicht könnt ihr mir ein par Tips geben welche Datenbank dafür am besten geeignet ist und wie ich sie dann in mein Programm einbinde.
Ich bin wie gesagt recht neu auf dem Gebiet. Vielleicht habe ich bei Google etc. einfach nach den falschen Begriffen gesucht...

cpu32
 
M

maki

Gast
Kannst hier auch mal suchen, haben so ein Thema 1-2 mal pro Woche, Vorzugsweise mit dem Titel "welche db".

Die DB kannst du nicht ins Jar einbetten, muss ja schließlich geändert werden, kann aber zur Laufzeit erzeugt werden.
 
N

nillehammer

Gast
Ich benutze selbst HSQLDB. Die kann man entweder als eigenen Serverprozess betreiben (so wie SQLServer oder MySql) oder man bindet die jar Datei in sein Programm ein und kann an in-process drauf zugreifen
 

cpu32

Mitglied
Danke schon mal für die schnellen Antworten!

Gesucht habe ich auch schon, und es wie gesagt ja auch schon mit derby probiert, bekomme es aber nicht so richtig hin... Und ich habe leider nirgends ein Tutorial oder der gleichen gefunden :(

Ich werde nochmal etwas herumprobieren... Vielen Dank schon mal!

cpu32
 
Zuletzt bearbeitet:

cpu32

Mitglied
Nun hat sich noch eine Frage ergeben... in der connectionURL muss ich ja den DB-Namen übergeben, muss ich dort dann einen absoluten Pfard zu der .mdf-Datei angeben?
 

cpu32

Mitglied
Hallo nochmal,

habe meine bisherigen Probleme mit eurer Hilfe (für euch ein paar Worte, aber es war für mich echt hilfreich!! :) ) weitgehend gelöst, d.h. ich kann nun Datenbanken erstellen und auch darauf zugreifen. Mein Problem besteht aber in der migration (nennt man das so?) meiner bestehemden MDF-Datei in das "neue" Dantenbanksystem von derby. Außerdem suche ich nach einem einfachen Tool um die eingebetteten Datenbanken zu bearbeiten (also einem Tool wie dem Managment Studio für den SQL-Server von MS)
Dann habe ich's, glaub ich, geschafft....

cpu32
 

cpu32

Mitglied
Danke für die schnelle Antwort! Nur bringt mir das leider im Moment noch nichts, da ich die MDF-Datei nicht migriert bekomme... :(
 
N

nillehammer

Gast
Danke für die schnelle Antwort! Nur bringt mir das leider im Moment noch nichts, da ich die MDF-Datei nicht migriert bekomme...
Auf dem Gebiet bin ich leider etwas ahnungslos (hab noch nie den MS SQL-Server benutzt). Deswegen nur zwei allgemeine Vorschläge. Du könntest Dich ber jdbc mit dem Server verbinden und eine "Select all" Abfrage machen, mit der Du in Java ein Objektmodell aufbaust. Danach genau das Objektmodell in die neue Datenbank speichern.
Eine andere Idee wäre, die Daten in csv-Dateien zu exportieren. Eine Google-Suche ergab u.a. den Treffer hier:
Export CSV Data From MSSQL Server Management Studio Express Ozzie Perez
 

turtle

Top Contributor
Ich bin ja bekanntermassen ein Fan von mybatis.

Damit würde ich mir ein einfaches Migrations-Tool schreiben, wie nillehammer schon angedeutet hat. Dieses Tool macht zwei Verbindungen zu Datenbanken auf, einmal Deine Quell-SQL-Server-Datenbank, und die andere DB ist die Ziel-Derby-DB. Um per JDBC auf SQL-Server zuzugreifen, benötigst den JDBC-Treiber, den Du einfach hier runterladen kannst

Dann liest Dein Tool alle Zeilen aus allen Tabellen aus und schreibst sie in die Ziel-DB. Damit das einfach bleibt, würde ich mit dem bereits erwähnten Squirrel mir das Schema der Quell-Datenbank anschauen und die Tabellen manuell (oder programmatisch) in der Ziel-DB erzeugen, abhängig davon von der Anzahl der Tabellen
 

turtle

Top Contributor
Wenn Du wirklich schon CSV-Dateien hast, kannst Du natürlich auch mit JDBC auf diese Dateien zugreifen. Dann wäre also die Quell-Datenbank die CSV-Datei.
 

cpu32

Mitglied
Danke für all die Antworten!!! Ihr seid echt Klasse hier :)
Hab das mit dem CSV-Import schon folgendermaßen hinbakommen:
Java:
Statement stmt = conn.createStatement();
			stmt.execute("Create Table Tabellenname (EinSpaltenName VARCHAR(255))"); // Zum erstellen der Tabelle (wenn Tabelle vorhanden natürlich nicht nötig)
			PreparedStatement ps=conn.prepareStatement(
				    "CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE  (?,?,?,?,?,?,?)");
		    ps.setString(1,null);
		    ps.setString(2,"Tabellenname");
		    ps.setString(3,"c:\..."); //der Dateipfard
		    ps.setString(4,null);
		    ps.setString(5,null);
		    ps.setString(6,"UTF8"); //Codierung (wenn mans nicht angibt gibts probleme mit den umlauten)
		    ps.setString(7,"1"); 
		    ps.execute();


Ich habe aber noch eine Frage ... ich habe nun schon viel herumprobiert, bekomms aber mal wieder nicht hin :(
Mein Ziel ist diesmal das erstellen einer Tabelle, nur wenn sie noch nicht vorhanden ist... ich habe auch bei google einiges gefunden aber es funzt alles nicht so recht...

mein ansatz:
Java:
		rs = dmd.getTables(null, "APP", "Filme_Parts", null) ;
			if (!rs.next()) {
			stmt.execute("Create Table Tabellenname (Spaltenname Integer)");
			}

aber wenn die tabelle vorhanden ist erstellt er sie trozdem, oder versucht es zumindest was natürlich eine Exception gibt... Wie bereits gesagt benutze ich derby alias JavaDB im embedded mode

Ich hoffe ihr könnt mir noch einmal aus der Patsche helfen :/

Danke!!

cpu32
 
Zuletzt bearbeitet:

cpu32

Mitglied
Diesen Weg habe ich ja mehr oder weniger auch gewählt
Aber jetzt hab ichs noch mal genau so wie auf der genannten Website gemacht aber der versucht immernoch die Tabelle zu erstellen :( Ich bekomme also immernoch diese Exception:
java.sql.SQLException: Table/View 'Tabellenname' ist bereits in Schema 'APP' vorhanden.
Mein geänderter Code:
Java:
DatabaseMetaData dmd = conn.getMetaData();
			ResultSet rs = dmd.getTables(null,"APP", "Tabellenname",null);
			if (!rs.next()) {
			stmt.executeUpdate("Create Table Tabellename (Spaltenname Integer)")
Ich bin doch mal davon ausgegangen, dass das auf der Website (Create Table IF NOT EXISTS … in JavaDB/Derby Frickelblog) angegebene "s" ein Statement sein soll - oder ist das falsch, weil im Text drüber steht nix dazu :(


Danke auf jeden fall schon mal für die schnelle Antwort und überhaupt deine Bemühungen :)

cpu32
 
Zuletzt bearbeitet:

cpu32

Mitglied
Java:
   DatabaseMetaData dmd = conn.getMetaData();
            ResultSet rs = dmd.getTables(null,"APP", "Tabellenname",null);
            if (!rs.next()) {
            stmt.executeUpdate("Create Table Tabellenname (Spaltenname Integer)")

Sorry, war nur ein Tipfehler, hatte aber nichts mit dem eigentlichen Problem zu tun, da ich 'Tabellenname' nur für den eigentlichen Namen eingesetz habe, um den Code für euch besser verständlich zu machen und nicht meine geheimsten Geheimnisse preiszzugeben :D

Aber mal im Ernst.. Ich hab den Code nun schon genau so übernommen blos die SQl-Querry etwas geändert, also meiner DB angepasst(Tabellen-Name und Spalten geändert), und es funktionier immer noch nicht... :( Kann mir denn keiner sagen was ich falsch mache???

cpu32
 
N

nillehammer

Gast
Hallo,

die Methode DataBaseMetadata.getTables erwartet Parameter, um die Suchergebnisse zu filtern. Z.B. führt der zweite Parameter dazu, dass nur Tabellen im Schema "APP" ausgegeben werden. Ich bin ziemlich sicher, dass Deine Tabellen nicht im Schema "APP" liegen. Wenn ich mir Deine create-Table-Statements so anschaue, würde ich vermuten, dass Deine Tabellen in garkeinem Schema liegen. Dafür wäre der Parameter dann "". Aber Sicherheit schafft nur ein Blick in Deine Datenbank mit einem Tool. Falls Dich die Funktionen von DataBaseMetadata näher interessieren, hier der Link zu den javadocs: Java Platform SE 6
 
Zuletzt bearbeitet von einem Moderator:

cpu32

Mitglied
Also anhand der Fehlermeldung sieht man doch, dass die Tabelle in dem Schema 'App' liegt:
java.sql.SQLException: Table/View 'Tabellenname' ist bereits in Schema 'APP' vorhanden.
Und diese Exception kommt immer noch, und auch wenn ich statt "App" null eingebe :( Wenn ich aber anstatt "App" "" Schreibe kommt das gleiche :(
Das Problem ist ich verstehe, auch mit Doc, das ganze nicht so richtig:
Wenn da steht
Java:
   if (!rs.next()) {
was gibt denn rs.next genau zurück? Also was bedutet das Ergebnis? -Das die Tabelle existiert? - Ich hab mir nun schon alles mögliche durchgelesen (deine Links auch!), Aber wenn ich das lese, siehts für mich aus als würde getTables Strings zurückgeben und kein boolean? ???:L
 
G

Gast2

Gast
next() bewegt den Zeiger auf die nächste Zeile und gibt true zurück wenn die Zeile gültig ist.
 
N

nillehammer

Gast
Hallo,

Also anhand der Fehlermeldung sieht man doch, dass die Tabelle in dem Schema 'App' liegt:
Wenn man sie sieht. Du hast sie leider nicht gepostet, deswegen musste ich raten.
was gibt denn rs.next genau zurück?
Das Ergebnis jeder SQL-Abfrage ist eine Menge von Zeilen (Englisch "rows") welche je nach Abfrage 1 bis n Spalten/Werte enthalten. Das ResultSet ist Java's Abstraktion von diesem Abfrageergebnis.

Mit next() iterierst Du über die Zeilen, die das ResultSet enthält. Gleichzeitig sagt es Dir, ob noch eine weitere Zeile enthalten ist. In diesem konkreten Fall ermittelst Du, ob es eine Tabelle mit einem bestimmten Namen gibt. Wenn beim Aufruf von next() false zurück kommt, gibt es sie nicht und Du kannst sie anlegen.

Der beschriebene Weg ist so simpel, dass er funktionieren muss. Also entweder steckt noch ein Fehler in Deinem Code. Dabei können wir Dir helfen, wenn Du ihn postest und bitte etwas mehr als nen Dreizeiler. Es kann ja sein, dass der Fehler an einer anderen Stelle ist. Oder es liegt an Deiner DB-Konfiguration. Dabei können wir Dir nicht helfen (Du kannst ja schlecht eine Derby DB posten ;). Du kannst aber selbst noch etwas tiefer hinein schauen
Java:
DatabaseMetaData dmd = conn.getMetaData();
Setze an dieser Zeile einen BreakPoint (bei Eclipse per Doppelklick auf die Zeilennummer am linken Rand) und rufe Dein Programm statt mit Run mit Debug auf. Es bleibt dann an der Zeile stehen. Wenn Du dann "Step over" in der Symbolleiste (wieder Eclipse) anklickst, springt es genau eine Zeile weiter. Du kannst dich jetzt durch den Inhalt von DatabaseMetaData durch hangeln und schauen, was für Informationen da überhaupt drinnen stehen.

Gruß nillehammer
 

cpu32

Mitglied
Java:
public static void connect() throws Exception{
//		Verbindung aufbauen
		//	DB-Treiber registrieren 
			String driver = "org.apache.derby.jdbc.EmbeddedDriver";
			Class.forName(driver);		
		//	ConnectionURL erstellen (Datenbank wird in einem Dialog ausgewählt
			String dbName = DB_Auswahl.choosenfile; 
			String connectionURL = "jdbc:derby:" + dbName + ";create=true";		
		//	Verbindung aufbauen
			conn = DriverManager.getConnection(connectionURL);
		//	Statement mit Verbindung verbinden
			stmt = conn.createStatement();
		//	Verbindung aufgebaut!

DatabaseMetaData dmd = conn.getMetaData();
			ResultSet rs = dmd.getTables(null, null, "Filme",null);
			if (rs.next() == false) {
		
			// Tabelle 'Filme' erstellen, falls sie nicht existiert
			stmt.execute("Create Table Filme (Name varchar(255), " +
					"Serie varchar(255), Jahr integer, FSK integer, Genre varchar(255), Subgenre varchar(255), Filmtyp varchar(255), " +
					"Infos varchar(255), FilmID  INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1))");
	}
conn.close
}
Also hier der Code...

Hab das ganze debugged ... oder zumindest versucht :(
Auch wenn die Tabellen existieren und das resultset true liefern müsste, liefert es false...
An der DB kanns eigentlich nicht liegen, da ich den ganz normalen JDBC-Treiber implementiert hab und auch jetzt immer wieder neue Datenbanken erstellt habe... Und nicht dran 'rumgeschraubt' hab.
Ich verstehs nicht - Wenns nicht klappt (was ich mir nicht erklären könnte) müsste ich eben in den Dialog, wo ich auch den DB-Pfard abfrage ne checkbox rein bauen ob die Tabellen erstellt werden sollen :/

cpu32
 
N

nillehammer

Gast
Hallo,

ich glaube zwar nicht, dass das die Ursache des Fehler ist, aber Du solltest so bald als möglich ResultSet.close() und Statement.close() aufrufen, um die jdbc-Resourcen wieder frei zugeben.

Das mit dem Haken in der GUI muss nicht sein. Es gilt zwar nicht als guter Stil, Ablaufsteuerung mit Exceptions zu machen (deswegen ja der "Versuch" mit den DataBaseMetaData), aber Du kannst um dein create-Statement durchaus einen try-catch Block machen und die Exception, die anzeigt, dass die Tabelle schon existiert, einfach schlucken, loggen oder als Warnmeldung an der Gui anzeigen.

Gruß nillehammer
 

turtle

Top Contributor
ich vermute Deine Abfrage macht die Suche case-sensitive. Daher probier mal
Java:
dmd.getTables(null,"APP", "TABELLENNAME ",null);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
thet1983 Derby/JavaDB Embedded Driver Datenbankprogrammierung 7
L H2 Embedded H2 Datenbank über Netzwerk zugreifen? Datenbankprogrammierung 0
J Hibernate + HSQL embedded Datenbankprogrammierung 2
H H2 Datenbank Embedded? Datenbankprogrammierung 8
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
D Embedded Derby Datenbank Datenbankprogrammierung 4
E embedded DB Datenbankprogrammierung 8
N suche embedded key-value-datenkank Datenbankprogrammierung 2
P Embedded Database und große Datenmengen Datenbankprogrammierung 23
F H2 embedded Datenbankprogrammierung 4
E H2 Verständnisfrage "Embedded"?? Datenbankprogrammierung 6
G Embedded Datenbank Datenbankprogrammierung 4
S Embedded DB, die aus mehreren JVMs gestartet werden kann? Datenbankprogrammierung 10
K Java DB Embedded DB Datenbankprogrammierung 8
M Embedded Datenbank? Datenbankprogrammierung 2
D Firebird Embedded dlls Datenbankprogrammierung 3
G embedded H2; wie tables anlegen? Datenbankprogrammierung 3
D Verknüpfung auflösen für Frontend Datenbankprogrammierung 7
R Beste Lösung für User Erstellung in mongodb Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
Zrebna Empfehlung für ein kostenloses DB-Hosting gesucht Datenbankprogrammierung 6
M Lösungsvorschläge für Multi-User Datenbankprogrammierung 1
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Denkanstoß für Ranking Datenbankprogrammierung 1
L Oracle Repräsentative Namen für die Column Types Datenbankprogrammierung 9
OnDemand Struktur für Parent / Child Produkt Datenbankprogrammierung 5
N ORM für Sqlite Datenbankprogrammierung 4
I Konzept: Klasse / Entity für Einstellung der Software Datenbankprogrammierung 3
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
Danloc Informationen für Datenbankverbindung wo/wie speichern? Datenbankprogrammierung 11
J Warum sind Sockets für einen Live-Chat sinnvoll? Datenbankprogrammierung 8
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
X PostgreSQL Datenbankdesign für Vokabeltrainer Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
M Idee Umsetzung //NFC Eintrittskarten für Geburtstag Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
J SQLite Ich muss für mein Projekt meine Datenbank Kapseln Datenbankprogrammierung 2
J Tipps für ERM Datenbankprogrammierung 4
P Highlevel-Lösung für Speicherung von Baumstruktur mit unbekannter Tiefe Datenbankprogrammierung 1
F welche Datenbank für Messwerte? Datenbankprogrammierung 4
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
M DB Schema für Vokabeltrainer Datenbankprogrammierung 2
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
S HSQLDB Fehlermeldung für den Bildschirm Datenbankprogrammierung 3
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
I Query für Geburtstage Datenbankprogrammierung 6
L Zentrale Datenbank im Internet für Spiele Highscores? Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
ruutaiokwu code-formatter für t-sql... Datenbankprogrammierung 12
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
T Mehrsprachigkeit für Tabellenfelder Datenbankprogrammierung 6
E MySQL Große Datenmengen reibungslos speichern für Gameserver Datenbankprogrammierung 6
F MSSql oder MongoDB für die Speicherung von POI Datenbankprogrammierung 9
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J Datenbank für Fragen/ Antworten Datenbankprogrammierung 7
O Datenbankschnittstelle für Java Datenbankprogrammierung 8
L Datenbank für kleinere Anwendungen Datenbankprogrammierung 3
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S ich brauche tipps für JDBC Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
GianaSisters SQL Befehl für allgemeine Datenbankexistenz Datenbankprogrammierung 4
B Beispiel für sicheres DBUsername/DBPassword handling Datenbankprogrammierung 4
I Anfänger-Tutorial für Hibernate gesucht Datenbankprogrammierung 3
heart_disease Beratung für Datenbankdesign Datenbankprogrammierung 13
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
F Performance-Tool für Oracle Datenbankprogrammierung 2
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
C Split String für SQl query Datenbankprogrammierung 10
A update methode für datenbank Datenbankprogrammierung 2
N Datenbank für Dateien Datenbankprogrammierung 6
N Datenbank für einen Stundenplan Datenbankprogrammierung 4
G welche Datenbanktabellen für folgende Attribute Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
S JPA (EntityManager für jeden Nutzer?) Datenbankprogrammierung 8
J Buffer Manager für Datenbank Datenbankprogrammierung 4

Ähnliche Java Themen


Oben