Datenbank automatisch erzeugen beim ersten Start

Theer

Mitglied
Hallo Leute,

ich benötige Hilfe bei der automatischen Erstellung einer Datenbank, wenn diese noch nicht angelegt wurde. Und zwar sollte es so ablaufen, wenn ich das Projekt auf einem anderen Server ablaufen lassen will, sollte man nur im db.properties den Datenbanknamen, User und PW ändern müssen! Danach wird die Dummy Datenbank mit Testdatensätzen erzeugt und gefüllt.
Wen ich die Datenbank manuell anlege, funktionieren die Datenbankverbindungen, ich kann auslesen und reinschreiben, wenn ich es auf einen anderen Server zum laufen bringen will, krieg ich die Unten gepostete Exception, das die Datenbank nicht exisitert.

Danke

Ich habe meinen Lösungsansatz hier gepostet.

db.properties File:
Code:
dbDriver com.mysql.jdbc.Driver
dbURL jdbc:mysql://localhost:3306/
dbName hugo
dbUser root
dbPwd init001

Connection Factory:

Java:
package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class DbConMgr {
	
	private static Properties dbProperties = null;
	private static Connection con = null;
	
	private static String dbDriver;
	private static String dbURL;
	private static String dbUser;
	private static String dbPwd;
	private static String dbName;
	private DbConMgr() {
		getDbProperties();
	}
	
	public static Connection getConnection() {
		if (con == null) {
			try {
				new DbConMgr();
				Class.forName(dbDriver);
				con = DriverManager.getConnection(dbURL, dbUser, dbPwd);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return con;
	}
	
	public static void getDbProperties() {
		dbProperties = new Properties();
		InputStream stream = null;
		stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("util/db.properties");
		
		try {
			dbProperties.load(stream);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			stream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		if (dbProperties.getProperty("dbDriver").length() != 0) {
			dbDriver = dbProperties.getProperty("dbDriver");
		}
		else {
			// TODO: Error message for missing property
		}
		
		if (dbProperties.getProperty("dbURL").length() != 0) {
			dbURL = dbProperties.getProperty("dbURL") + dbProperties.getProperty("dbName");
			// TODO: Use standardized file separator instead of "/"
		}
		else {
			// TODO: Error message for missing property
		}
		
		if (dbProperties.getProperty("dbUser").length() != 0) {
			dbUser = dbProperties.getProperty("dbUser");
		}
		else {
			// TODO: Error message for missing property
		}
		if (dbProperties.getProperty("dbName").length() != 0) {
			dbName = dbProperties.getProperty("dbName");
			}
		else { 
			// TODO: Error message for missing property
	    }
		
		if (dbProperties.getProperty("dbPwd").length() != 0) {
			dbPwd = dbProperties.getProperty("dbPwd");
		}
		else {
			// TODO: Error message for missing property
		}
	}
	private static String convertStreamToString(InputStream is) {
		// TODO Auto-generated method stub
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
   	 
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
		
	}
	public static Connection get() throws SQLException { 
		Connection con = null;
		try {
			   Class.forName(dbDriver);
			   con = DriverManager.getConnection(dbURL,dbUser,dbPwd);
			   
		} catch (Exception e) {
			System.out.println(e +" using drv=" + dbDriver +
			                ", dsn=" + dbURL +
			                ", user=" + dbUser +
			                ", pwd=" + dbPwd);
			e.printStackTrace();
		}
		
		Statement stmt = null;
		try {
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("USE " + dbName);
			System.out.println("Use " + dbName);
								
			} catch (SQLException e) {
			InputStream  stream = null;
			stream =  Thread.currentThread().getContextClassLoader().getResourceAsStream("beans/create_db.sql");
			stmt.executeQuery(convertStreamToString(stream));
			
			}
		return con;
		
		}
	
}

Die zu erzeugende SQL Datenbank
SQL:
CREATE DATABASE IF NOT EXISTS hugo;
USE hugo;

DROP TABLE IF EXISTS metrica_tch_droprate;
DROP TABLE IF EXISTS metrica_stationsnamen;
	
CREATE TABLE metrica_stationsnamen ( 
	CI     	int(11) NOT NULL,
	STATION	text NOT NULL,
	COMMENT	text NULL 
	);
CREATE TABLE metrica_tch_droprate ( 
	CI         	int(11) NOT NULL,
	KW01	float NOT NULL,
	KW02	float NOT NULL,
	KW03	float NOT NULL,
	KW04	float NOT NULL,
	KW05	float NOT NULL,
	KW06	float NOT NULL,
	KW07	float NOT NULL,
	KW08	float NOT NULL,
	KW09	float NOT NULL,
	KW10	float NOT NULL,
	KW11	float NOT NULL,
	KW12	float NOT NULL,
	KW13	float NOT NULL,
	KW14	float NOT NULL,
	KW15	float NOT NULL,
	KW16	float NOT NULL 
	);

INSERT INTO metrica_stationsnamen(CI, STATION, COMMENT) VALUES
(1, 'Station 1', 'Interferenz mit Station 2'),
(2, Station 2', NULL),
(3, 'Station 3', NULL),
(4, 'Station 4', NULL),
(5, 'Station 5', NULL),
(6, 'Station 6', NULL),
(7, 'Station 7', NULL),
(8, 'Station 8', NULL),
(9, 'Station 9', NULL),
(10, 'Station 10', NULL);

INSERT INTO metrica_tch_droprate(CI, KW01, KW02, KW03, KW04, KW05, KW06, KW07, KW08, KW09, KW10, KW11, KW12, KW13, KW14, KW15, KW16) VALUES
  (1, 0.33, 0.99, 2.01, 0.73, 1.28, 1.72, 1.37, 1.87, 1.15, 0.78, 1.49, 1.83, 1.46, 0.77, 1.59, 1.04),
  (2, 0.54, 0.14, 0.17, 0.14, 0.15, 0.17, 0.15, 0.2, 0.14, 0.15, 0.15, 0.17, 0.14, 0.17, 0.19, 0.18),
  (3, 0.5, 0.41, 0.52, 0.46, 0.44, 0.53, 0.57, 0.52, 0.53, 0.52, 0.46, 0.55, 0.66, 0.73, 0.92, 0.97),
  (4, 0.65, 0.51, 0.55, 0.44, 0.45, 0.57, 0.56, 0.54, 0.52, 0.46, 0.7, 0.67, 0.73, 0.84, 1.26, 1.33),
  (5, 0.09, 0.1, 0.09, 0.14, 0.14, 0.2, 0.16, 0.12, 0.12, 0.12, 0.18, 0.06, 0.24, 0.17, 0.12, 0.11),
  (6, 0.21, 0.11, 0.1, 0.11, 0.1, 0.1, 0.21, 0.11, 0.12, 0.0, 0.11, 0.12, 0.12, 0.12, 0.13, 0.11),
  (7, 0.27, 0.28, 0.31, 0.32, 0.24, 0.25, 0.32, 0.23, 0.25, 0.23, 0.28, 0.27, 0.24, 0.2, 0.22, 0.22),
  (8, 0.08, 0.06, 0.11, 0.05, 0.06, 0.05, 0.05, 0.05, 0.06, 0.06, 0.0, 0.06, 0.12, 0.06, 0.12, 0.11),
  (9, 0.21, 0.2, 0.18, 0.23, 1.18, 0.25, 0.23, 0.25, 0.19, 0.17, 0.26, 0.17, 0.33, 0.22, 0.22, 0.25),
  (10, 0.33, 0.31, 0.32, 0.35, 0.33, 0.39, 0.32, 0.35, 0.32, 0.3, 0.32, 0.33, 0.37, 0.37, 0.3, 0.34);


ALTER TABLE metrica_stationsnamen
	ADD CONSTRAINT PRIMARY
	PRIMARY KEY (CI);

ALTER TABLE metrica_tch_droprate
	ADD CONSTRAINT PRIMARY
	PRIMARY KEY (CI);



Code:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: [B]Unknown database 'hugo'[/B]
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1026)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)
	at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2037)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:724)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:304)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at util.DbConMgr.getConnection(DbConMgr.java:40)
	at util.DbTableOperations.getArray(DbTableOperations.java:36)
	at tglibs.achillestable.doStartTag(achillestable.java:26)
	at org.apache.jsp.index_jsp._jspx_meth_datatld_005fachillestable_005f0(index_jsp.java:124)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:90)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 
G

Gast2

Gast
Falls du mit Transaktionen arbeitest musst du nachdem du die Datenbank erstellt hast ein comit() machen. Sonst bekommt die Datenbank davon noch nichts mit :)
 

Theer

Mitglied
Also eigentlich bin ich davon ausgegangen, dass der Fehler im java Code sein müsste, da die MySql 5.1 die ich verwende ja Standardmäßig autocommit hat, das würde aber einiges erklären - verwende zum Testen das Aquadatastudio, jedoch scheint dies SQL Statements nur einzeln anzunehmen, im Phpmyadmin auf einem anderen Server funktioniert das sql File, wenn ich die Zeilen Create Database und Use rausnehme, daher bin ich davon ausgegangen das es funktioniert. Start Trasaction und Commit nach jeden Befehl hat nichts verändert.
Hättest du die Möglichkeit das SQL File bei dir mal zu testen?
 

AlexSpritze

Bekanntes Mitglied
Irgendwie passen die Zeilennummern des Source nicht mit der Fehlermeldung. In Zeile 40 von DbConMgr ist nur ein simples return.

Wird denn die statische Methode get() vor der Fehlermeldung aufgerufen? Bzw. was ist der Unterschied zwischen get() und getConnection()!?
 

henpara

Bekanntes Mitglied
ResultSet rs = stmt.executeQuery("USE " + dbName);
warum sollte er das machen, wenn der dbName zu der Zeit noch garnicht existiert?

du solltest die Abfrage, ob die dB existiert gesondert machen, danach, wenn du SICHER bist, daß die dB existiert erst die restliche Abfrage schicken.

Auch was deine Angaben angeht klingt das sehr danach, daß der einfache try-catch block dort nicht reicht.
Oder anders gesagt: wie soll der "executeQuery" funktionieren, wenn zu dem Zeitpunkt die "dbName" noch garnicht existiert?
 

Theer

Mitglied
Hallo, danke für die Antworten, habe es nun wie folgt gelöst:

Zuerst wird die DB erzeugt und danach wird das SQL File bei den ";" aufgesplittet, wodurch es möglich war Multiple QUeries durch zuführen.

Sicher nicht die sauberste Lösung aber funktionell :)

Java:
try {
                       stmt = con.createStatement();
                       stmt.executeQuery("USE `" + dbName + "`;");
                       System.out.println("Datenbank: " + dbName + " erfolgreich!");
               } catch (SQLException e) {
                       System.out.println("Datenbank " + dbName + " fehlgeschlagen!");
                       InputStream stream = null;
                       stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("beans/create_db.sql");
                       try {
                               stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + dbName + "`;");
                               stmt.executeQuery("USE `" + dbName + "`;");
                               System.out.println("Datenbank wurde verwendet");
                               String file = convertStreamToString(stream);
                               System.out.println("SQL File wurde ausgeführt");
                               // Multiple Queries
                               statements = file.split(";");
                               for (String stat : statements) {
                                       stmt.executeUpdate(stat);
                               }

                       } catch (Exception e1) {
                               System.out.println("Inputstream Fehler!");
                       }
               }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
E schneller von der Datenbank abfragen Java Basics - Anfänger-Themen 15
E Datenbank Spalte zusammenzählen Java Basics - Anfänger-Themen 2
R Datenbank Java Basics - Anfänger-Themen 1
I API Key´s in der Datenbank decrypt / encrypten? Java Basics - Anfänger-Themen 23
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
M Von der Datenbank zum Textfield Java Basics - Anfänger-Themen 16
R Best Practice Logik in der Datenbank oder in Java? Java Basics - Anfänger-Themen 3
R Datenbank-Werte dynamisch ausgeben Java Basics - Anfänger-Themen 19
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
T Datenbank | Welche am Sinnvollsten? Java Basics - Anfänger-Themen 5
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Datenbank wird nicht erstellt Java Basics - Anfänger-Themen 31
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
Meeresgott OOP Gui, Logik und Datenbank richtig aufbauen Java Basics - Anfänger-Themen 43
B Schreiben von zu vielen Einträgen in einer Datenbank Java Basics - Anfänger-Themen 9
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
N Datenbank mit GUI verbinden - Wie? Java Basics - Anfänger-Themen 5
1 Datenbank in Java Java Basics - Anfänger-Themen 1
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
J Bücher Datenbank Java Basics - Anfänger-Themen 5
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
J Datum und Uhrzeit in Datenbank falsch hinterlegt Java Basics - Anfänger-Themen 13
R Erstversuch Datenbank Java Basics - Anfänger-Themen 6
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
T Sql Datenbank - variable übergeben? Java Basics - Anfänger-Themen 8
C Passwörter möglichst sicher in Datenbank speichern Java Basics - Anfänger-Themen 18
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
J GUI mit phpMyAdmin Datenbank verbinden Java Basics - Anfänger-Themen 0
K Erste Schritte Datenbank SQL erklärung Java Basics - Anfänger-Themen 15
B Lokale Datenbank Java Java Basics - Anfänger-Themen 2
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
U Datenbank in Java Java Basics - Anfänger-Themen 8
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
B Dateiname in Datenbank schreiben Java Basics - Anfänger-Themen 2
J fortlaufende Objekte durch Variable auswählen; Datenbank Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
C Datenbank - Welche Java Basics - Anfänger-Themen 5
B Java Objektorientierte Datenbank - Assoziation Hilfe Java Basics - Anfänger-Themen 4
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
J Erste Schritte Objekte in Datenbank speichern Java Basics - Anfänger-Themen 26
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
K Input/Output Datenbank Java Basics - Anfänger-Themen 27
M Datenbank in die Gui Java Basics - Anfänger-Themen 4
J JTable mit Daten aus Datenbank füllen Java Basics - Anfänger-Themen 3
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
M Brauche ich ein Datenbank oder nicht? Java Basics - Anfänger-Themen 6
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
F Classpath Datenbank ... nur wo? Java Basics - Anfänger-Themen 24
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
B Personalnummer aus Datenbank Java Basics - Anfänger-Themen 3
M Welche Datenbank? Java Basics - Anfänger-Themen 5
J RadioButtonInhalt in Datenbank übergeben Java Basics - Anfänger-Themen 3
R Datenbank bei Klassenverteilung führt zu NullPointerException Java Basics - Anfänger-Themen 7
J PW von Datenbank wie abspeichern? Java Basics - Anfänger-Themen 2
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
J Kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
T Zugangsdaten für Datenbank in Java-Programm speichern? Java Basics - Anfänger-Themen 5
S Schnittstelle für Datenbank bzw. Dateiformat Java Basics - Anfänger-Themen 2
C ComboBoxModel mit Daten der Datenbank verändern Java Basics - Anfänger-Themen 2
I Datenbank - nach erster Verbindung keine Verbindung mehr Java Basics - Anfänger-Themen 3
F Datenbank in eine Textdatei speichern Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben