Probleme mit Datenbanken

  • Themenstarter Themenstarter KlemensyXYZ
  • Beginndatum Beginndatum
K

KlemensyXYZ

Gast
Moin,

ich habe dazu zwei Fragen:

1.)
Kann ich den Datenbanktreiber irgendwie mit in eine .jar Datei packen?
Ich habe das bis jetzt hier
(C:\Program Files (x86)\Java\jre6\lib\ext\mysql-connector-java-5.1.15-bin.jar)
liegen gehabt. Das funktioniert so für mich zuhause ja ganz gut, nur ich kann ja nicht vorraussetzten das jeder den Treiber da installiert hat.
Ich habe das schon versucht: (Create and Export MySQL JDBC driver bundle - Eclipsepedia)
das sieht bei meiner eclipse Version aber alles anders aus.

2.)
Kann man auch Datenbanken mit in die .jar Datei packen?
Finde ich irgendwie ganz praktisch.
Bei mir liegen die im Ordner C:\xampp\mysql\data.
Müssen die da immer liegen?
und brauche ich immer xampp o.ä. damit die laufen?

Danke
 
1.) leg sie halt in ./lib/ und mach das deiner .jar im classpath in der manifest.mf klar, dass es dort danach suchen muss

2.) entweder du hast irgendein ini/properties-gesteuerten data-path oder du legst das ins user.dir, oder du legst das einfach relativ zu deinem classpath > ./data/
 
1.) leg sie halt in ./lib/ und mach das deiner .jar im classpath in der manifest.mf klar, dass es dort danach suchen muss

ist ./lib/ jetzt ein package oder ein normales verzeichnis?
dann den mysql connector als jar da rein oder entpackt?

ich habe bei einem projekt noch nie die manifest datei oder den classpath verändert
(jedenflass hat das noch nie funktioniert)
was muss ich denn dan da in welche datei genau schreiben?

2.) entweder du hast irgendein ini/properties-gesteuerten data-path oder du legst das ins user.dir, oder du legst das einfach relativ zu deinem classpath > ./data/

hö?
ganz GROSSER Bahnhof :bahnhof:
 
Du hast einen Ordner Namens "DeinProgramm". Darin befindet sich ein Ordner Namens "lib" und deine .jar Datei. Der Ordner "lib" enhält die Datei mysql_con.jar.

Jetzt machst du deine .jar mit einen Entpackungstool (WinRAR o.ä.) auf, gehst in META-INF und öffnest die MANIFEST.MF

Dort erweiterst du dann den Class-Path:
Code:
Manifest-Version: 1.0
Main-Class: DeineMainClass (Packagestruktur beachten)
Class-Path:[B] lib/mysql_con.jar [/B].
(die Leerzeile am Ende - Zeile 4 - ist wichtig!)

zu Zweitens:
System (Java Platform SE 6)

System.getProperty("user.dir"); liefert dir das Benutzerverzeichnis. Darin könntest du z.b. embedded DBs ablegen.

Oder im Ordner DeinProgramm gibt es eine DeinProgramm.ini oder DeinProgramm.properties. Dort wäre dann ein data folder gesetzt:

datafolder = ./data
oder
datafolder = c:/data


Oder halt einfach immer das aktuelle Verzeichnis im Code nehmen ./data
 
Du hast einen Ordner Namens "DeinProgramm". Darin befindet sich ein Ordner Namens "lib" und deine .jar Datei. Der Ordner "lib" enhält die Datei mysql_con.jar.

ich habe nirgendwo einen "lib" ordner oder ähnliches.
Ich kann zwar bei packen des jar files einen erstellen, der ist dann aber leer

Fangen wir mal ganz von vorne an:

Also ich habe ein eclipse Projekt im Worspace liegen
Darin liegt der src und der bin Ordner.
Diese enthalten die .java und .class Dateien für das Programm was auf die Datenbank zugreifen soll.
Außerdem ist dort eine .projekt Datei, eine .classpath Datei und ein .settings Ordner der die Datei
org.eclipse.jdt.core.prefs enthält.

Dann habe ich den mysql connector als .jar Datei.
Zurzeit in C:\Program Files (x86)\Java\jre6\lib\ext\
und einmal als Sicherheitskopie im Download Ordner in den Dokumenten.

was muss ich nun als nächstes tun?
 
habe ich dir doch schon geschrieben. ich kann dir nicht jeden einzelnen schritt erklären.

- du erstellst in eclipse aus deinem projekt eine jar-datei und packst dort nur den ordner src rein
- du legst diesen zusammen mit einem lib-ordner, worin die mysql.jar ist, in einen ordner
- erweiterst den classpath in der jar-datei (siehe oben)

punkt 2 lass ich jetzt erstmal weg. eins nach dem anderen 🙂
 
habe ich dir doch schon geschrieben. ich kann dir nicht jeden einzelnen schritt erklären.

- du erstellst in eclipse aus deinem projekt eine jar-datei und packst dort nur den ordner src rein
- du legst diesen zusammen mit einem lib-ordner, worin die mysql.jar ist, in einen ordner
- erweiterst den classpath in der jar-datei (siehe oben)

punkt 2 lass ich jetzt erstmal weg. eins nach dem anderen 🙂

ok ich habs :toll:
nur das der blöde explorer dabei ständig abschmiert 😱

aber egal ich habs hinbekommen

so und nun zu punkt 2 ;-)
 
naja du gibst ja irgendwo einen pfad der embedded db an. diesen kannst du ja aufs user.dir setzten oder auf einen properties-gesteuertes datadir oder einfach relativ zum aktuellen verzeichnis (mit ./data o.ä).

z.b. bei h2 geht das auch so (weiß net wie das bei mysql ist):
Quickstart
The database URL jdbc:h2:~/test opens the database test in your user home directory
 
naja du gibst ja irgendwo einen pfad der embedded db an.

Was ist denn embedded?
und nein bei mysql habe ich keinen pfad
Da mach ich das so:
con = DriverManager.getConnection("jdbc:mysql://host😛ort/"dbName", "user", "passwort");

diesen kannst du ja aufs user.dir setzten oder auf einen properties-gesteuertes datadir oder einfach relativ zum aktuellen verzeichnis (mit ./data o.ä).

das habe ich immer noch nicht kapiert
 
dann hast du local eine serverinstallation? kenn mich mit mysql nicht so aus aber das geht glaub sowohl als auch
 
is theoretisch nen server der nur für mich on ist und auch nur wenn ich den dazugehörigen dienst starte.

Meinst du deine h2 datenbank wäre hirmit einfacher zu bewerkstelligen?

Oder kennt sich jemand anderes damit aus?
 
ich nehm immer h2. kann ich nur empfehlen. habe zwar keine anderen getestet sein aber scheint mir das neuste und von den benchmarks auch das schnellste zu sein. dachte fälschlicherweiße, dass eine mysql auch embedded geht (meinte es irgendwo gelesen zu haben) aber das ist glaub nicht so (oder es gibt ne extra mysql embedded version - kp, von mysql - wie gesagt - keine ahnung 😀). ich bin in dem thema jetzt aber auch noch net so lange drin, aber wennste eine db nur für deine applikation willst, würde sich da eine embedded db schon anbieten. wenn die db für jeden gleich ist, dann halt einfach ins programmverzeichnis. ansonsten bietet sich z.b. das user.dir an
 
ich nehm immer h2. kann ich nur empfehlen. habe zwar keine anderen getestet sein aber scheint mir das neuste und von den benchmarks auch das schnellste zu sein.

tja nur irgendwie steige ich da nicht durch ???:L
wo wird denn diese db abgespeichert?
irgendwie muss die ja ans Programm

dachte fälschlicherweiße, dass eine mysql auch embedded geht (meinte es irgendwo gelesen zu haben) aber das ist glaub nicht so (oder es gibt ne extra mysql embedded version)

wenn ich das richtig verstanden habe kann man sich mysql embedded srver kaufen

aber wennste eine db nur für deine applikation willst, würde sich da eine embedded db schon anbieten

Ich habe das jetzt so verstanden, dass embedded eingebettet heißt.
Ist diese Datenbank dann noch durch ein Programm veränderbar?
 
tja nur irgendwie steige ich da nicht durch ???:L
wo wird denn diese db abgespeichert?
irgendwie muss die ja ans Programm

Also wie gesagt ich denke das mit mysql wird schwer werden. MySQL ist ein Server auf den du dich verbindest, den kann man nicht einfach in ein jar kopieren.

Du brauchst eine embedded Datenbank wie H2 oder Java DB

Was heißt du blickst da nicht durch? Wie viel Zeit hast du schon auf H2 Database Engine (redirect) verbracht? les dir das mal genau durch...
 
ah da liegen so ein paar sachen rum
- .boxit.ini
- .h2.server.properties
- .javafx_eula_accepted
- .jose.user.prefrences
- .Sti_Trce.log
- test.h2.db
- test.lock.db

was gehört davon denn jetzt zur db?
ich denke mal die kursiven auf jeden fall
und kann ich das dann auch in einen ordner schmeißen?
 
Zuletzt bearbeitet von einem Moderator:
klar. gib halt einfach bei der Connection den Pfad an (statt ~/test halt c:/deinOrdner/test)

Aber das steht auch alles auf der Homepage von H2. Die Library ist echt mal sehr gut dokumentiert. Du musst es nur nutzen 😉
 
test.h2.db ist deine datenbank und test.lock.db ist das lock, welches mit conn.close() freigegeben wird. die properties werden, falls nicht vorhanden, mit den default-werten gefüllt. also um die brauchste dich in den meisten fällen nicht kümmern
 
ok also lag ich da gar nicht so falsch

und eine (vermutlich) letzte frage dazu:

Dort erweiterst du dann den Class-Path:
Code:
Manifest-Version: 1.0
Main-Class: DeineMainClass (Packagestruktur beachten)
Class-Path:[B] lib/mysql_con.jar [/B].
(die Leerzeile am Ende - Zeile 4 - ist wichtig!)

kann man da auch mehrere Pfade in die Manifest datei packen?
und wenn ja wie
vielleicht mit einem komma oder semikolon?
 
ne einfach mit einem leerzeichen
Code:
Class-Path: lib/mysql_con.jar lib/h2.jar .
 
so ich habe mit der h2 console grade versucht ne tabelle zu erstellen :autsch:

und zwar damit
SQL:
CREATE TABLE rohstoffe (RID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Rohstoff VARCHAR(30), Menge INT, gesamt INT, Punkte INT)AUTO_INCREMENT=1;

ist dass denn keine normale SQL Syntax?
bei mysql hat der Befehl wunderbar funktioniert
 
gut. welche sqlexception bekommst du?

so sollte es gehn:
SQL:
CREATE TABLE rohstoffe (RID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,Rohstoff VARCHAR(30), Menge INT, gesamt INT, Punkte INT)
 
Zuletzt bearbeitet:
habs hinbekommen
h2 mag scheinbar überhaupt kein auto increment
ist zwar schade aber nicht so schlimm

ähm wenn die datenbank im jar drin ist kann die dann noch durch nen update befehl o.ä. verändert werden?
 
also bei mir hat das mit dem autoincrement funktioniert..
im zweifelsfall sollte es mit ALTER TABLE ... ALTER COLUMN ... klappen.

würde die datenbank nicht in die jar legen. macht für mich keinen sinn und kann auch imho nicht funktionieren. aber gewöhne dir doch mal etwas try&error an 😉

edit: achja. vergess den index nicht
 
aber gewöhne dir doch mal etwas try&error an 😉
oh ich hatte gestern genug try und noch mehr error mit mysql
da hab ich mir gdacht ich frag besser mal vorher😉

edit: achja. vergess den index nicht
wofür brauch ich den denn und wie bekomme ich den????:L
Quickstart hab da nix drüber gefunden

so jetzt habe ich nur noch ein problem 😳

naja du gibst ja irgendwo einen pfad der embedded db an. diesen kannst du ja aufs user.dir setzten oder auf einen properties-gesteuertes datadir oder einfach relativ zum aktuellen verzeichnis (mit ./data o.ä).

ich muss da ja einen relativen Pfad verwenden, da ich ja nicht weis was der Endbenutzer für eie Verzeichnisstruktur hat und wo er das Programm ablegt.
Also ich würde neben dem "lib" jetzt einen Ordner "data" anlegen und da die db reinschmeißen.
Dann den Pfad so setzen:
jdbc:h2://data/spielstand
oder geht das nicht?
 
Where are the Database Files Stored?

When using database URLs like jdbc:h2:~/test, the database is stored in the user directory. For Windows, this is usually C:\Documents and Settings\<userName>. If the base directory is not set (as in jdbc:h2:test), the database files are stored in the directory where the application is started (the current working directory). When using the H2 Console application from the start menu, this is <Installation Directory>/bin. The base directory can be set in the database URL. A fixed or relative path can be used. When using the URL jdbc:h2:file:data/sample, the database is stored in the directory data (relative to the current working directory). The directory is created automatically if it does not yet exist. It is also possible to use the fully qualified directory name (and for Windows, drive name). Example: jdbc:h2:file:C:/data/test

edit: wobei ich es glaub so machen würde:
Code:
jdbc:h2:/data/test
musste einfach mal testen. vllt auch
Code:
jdbc:h2:./data/test
🙂

Quickstart hab da nix drüber gefunden
die seite besteht aus mehr, als nur den "Quickstart" 😉.

kuck mal unter SQL-Grammar bei CREATE INDEX. im faq findest du da auch was dazu
 
Zuletzt bearbeitet:
Ein Index wird verwendet um die Suche nach Datensätzen zu beschleunigen. Wenn du also häufig anhand einer ID-Spalte Einträge suchst, dann solltest du einen Index für diese Spalte erstellen.

Mehr dazu z.B. in Wikipedia:
Datenbankindex
 
ja kommt natürlich auf die größe der db an aber allgemein ist ein index nie verkehrt. schadet ja nicht 🙂

edit um das zu verdeutlichen: select ohne top1 o.ä. auf eine datenbank mit 250000 Datensätzen braucht man ohne index ca. 6 sekunden, mit ca. 20 millisekunden. Nicht auf die werte festsetzen, ich will damit nur sagen, dass es einen deutlichen unterschied macht
 
Zuletzt bearbeitet:

Zurück
Oben