Derby/JavaDB Probleme beim anlegen einer embedded DB

SteeL1942

Aktives Mitglied
Moin,

versuche seit ein paar Stunden, mich an Datenbanken und Java heran zu tasten. Dazu wollte ich mittels Derby eine embedded Datenbank erstellen. Um es vorweg zu nehmen: Von "guten Kentnissen" in sachen Datenbanken bin ich weit weg. Das Thema wurd in der schule zwar mal angeschnitten, aber das hat sich nur auf ein paar abfragen einer mysql datenbank beschränkt.
Daher wollte ich für den Anfang erstmal nur ein bisschen mit den Befehlen herum spielen, um der Sache etwas näher zu kommen. Aber da bin ich schon gleich vor die Wand gelaufen :autsch:

Mein Programm sieht im moment so aus:

Java:
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Start extends Frame{
	
	private Button los;
	private Connection con;
	public static void main(String[] args)
	{	
		new Start();
	}
	
	public Start()
	{
		this. setSize(500,500);
		this.setVisible(true);
		this.setLayout(null);
		los = new Button("los");
		los.setBounds(50,50,100,20);
		add(los);
		
        los.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                aktion();
            }});
        
		try {
			Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
			con = DriverManager.getConnection( "jdbc:derby:testDB;create=true" );
		} catch (Exception e1)
		{
			System.out.println(e1.getMessage());
		}
	}
	
	private void aktion()
	{
		Statement test;
		ResultSet rs;
		try {
			test = con.createStatement();
			test.executeUpdate("CREATE TABLE PUNKTELISTE (NAME VARCHAR(50), Punkte INTEGER)");
			test.executeUpdate("INSERT INTO punkteliste (Name, Punkte) Values ('Hugo', 1234)");
			rs = test.executeQuery("SELECT * FROM PUNKTELISTE");
			System.out.println(rs.getString(1));
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		
	}

}

Einfach ein Fenster mit nem Button, der die Befehle dann zur DB sendet. Die Tabelle erstellen und einen Datensatz einfügen funktioniert ohne Probleme. Aber sobald er zu dem Select-Befehl kommt, spuckt er folgendes aus:

Java:
Invalid cursor state - no current row.

Bei der suche hier im Forum bin ich auf einen Beitrag gestoßen, wo jemand das selbe Problem hatte. Von seiner "Lösung" habe ich die drei Befehle 1:1 kopiert und trotzdem läuft es nicht.
Auch wenn ich Zeile 51 durch
Java:
rs = test.executeQuery("SHOW TABLES");
ersetze, zickt er rum. Da bekomme ich folgenden Fehler:
Java:
Syntax error: Encountered "SHOW" at line 1, column 1.

Bei letzterem meckert er ja wegen syntax, aber wie formuliere ich das richtig? Bei dem SQL-kram in der Schule hat es so funktioniert :( Ich hoffe mal, dass mir da jemand auf die Sprünge helfen kann ;)

gruß SteeL
 

Guybrush Threepwood

Top Contributor
Du musst den Cursor erst bewegen, also
Java:
rs.next();

Falls Du mehrere Ergebnisse durch das Select erwarest, dann irgend etwas à la
Java:
while (rs.next()){
    //do something
}
 
N

nillehammer

Gast
Ich weiß nicht, wie gnägidg Derby bei Groß-Klein-Schreibung ist, aber versuch mal, darauf zu achten. Das ist in Deinen Statements etwas wild. Ich schlage folgendes vor:
[JAVA=49]
test.executeUpdate("CREATE TABLE Punkteliste (name VARCHAR(50), punkte INTEGER)");
test.executeUpdate("INSERT INTO Punkteliste (name, punkte) VALUES ('Hugo', 1234)");
rs = test.executeQuery("SELECT * FROM PUNKTELISTE");
[/code]
Außerdem musst Du (am besten in einer Schleife) rs.next() aufrufen.
[EDIT]
Ach man, da war wieder einer schneller
[/EDIT]
 

SteeL1942

Aktives Mitglied
Soo. Dank dem hinweis mit rs.next() zeigt er in der tat was an. Was das "SHOW TABLES" angeht, so war ich davon ausgegangen, dass er das kennt. Die anderen Befehle gabs bei dem mysql ja auch. aber nun ja, dann wohl nicht ^^
wie heißt denn der dazu passende befehl bei derby?
 

JimK

Bekanntes Mitglied
Moin

Ich arbeite auch gerade mit einer embedded Datenbank und musste feststellen, dass einige Befehle von abweichen.

Schau mal hier
 
Zuletzt bearbeitet:

SteeL1942

Aktives Mitglied
Gibt es irgendeine möglichkeit den log bei derby auszuschalten? ich war jez soweit, dass ich per schleife ein paar hundert einträge in die datenbank speisen wollte. das hat doch ziemlich lange gedauert. ich vermute, es liegt am log. der erstellt ja in dem unterordner log immer irgendwelche logfiles während daten neu eingefügt werden. habe auch schon versucht mit diesem aufrum die datenbank in den ram zu legen:
Java:
DriverManager.getConnection( "jdbc:derby:memory:testDB;create=true;dataEncryption=true;bootPassword=xxxxx" );

das scheint er auch zu machen. nur wird es nicht wesentlich schneller. kann ich da was ändern??
 

Guybrush Threepwood

Top Contributor
Wie lange hat es denn gedauert? Hast Du zwischen dem Startup und dem Einspeisen der Daten getrennt gemessen? Es gibt viele Gründe, die die Geschwindigkeit reduzieren können. Inserst bei Derby scheinen wohl generell nicht sooo schnell zu sein und es gibt einige Tuning-Tipps : java - Apache Derby INSERTS are slow - Stack Overflow
Ich arbeite mit H2 und da ist das INSERT eigentlich recht flott. Verwendest Du PreparedStatements? Das hat viele Vorteile. Neben der Sicherheit ist es die Geschwindigkeit bei der mehrfachen Verwendung.

P.S.: Aus dem "Tuning-Handbuch" von Derby ( http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf )
Avoid inserts in autocommit mode if possible
Inserts can be painfully slow in autocommit mode because each commit involves an update of the log on the disk for each INSERT statement. The commit will not return until a physical disk write is executed. To speed things up:
  • Run in autocommit false mode, execute a number of inserts in one transaction, and then explicitly issue a commit.
  • If your application allows an initial load into the table, you can use the import procedures to insert data into a table. Derby will not log the individual inserts when loading into an empty table using these interfaces. See the Derby Reference Manual and the Derby Server and Administration Guide for more information on the import procedures.
 
Zuletzt bearbeitet:

SteeL1942

Aktives Mitglied
Mit PreparedStatements geht deutlich schneller und wenn ich die Datenbank dann auch im RAM ablege, gehts in wenigen Sekunden. So stelle ich mir das vor :)
 

SteeL1942

Aktives Mitglied
Glaube, jetzt stehe ich vor einem Problem, dass sich so ohne weiteres nicht lösen lässt. Dank Datenbank im Ram und prepared statements hab ich ja schon ordentlich an Geschwindigkeit gewonnen, aber jetzt werde ich wieder ausgebremst:

Habe die Datenbank im Ram abgelegt und agiere nur über prepared statements. Frage ich nun ein Element aus der datenbank ab, so vergehen 3-4 sekunden, bis ich das ergebnis erhalte. An sich erstmal nicht tragisch. Wenn ich aber mehrere 100 Elemente abfragen will, vergehen so schnell mehrere minuten.
Habe die Datenbank mit 300.000 datensätzen gefüttert. Das dürfte wohl zu viel sein, oder? nützt es was, wenn ich die tabellen aufsplitte in mehrere kleine?
Ein blick in den Taskmanager zeigt das Problem: javaw.exe ist bei 25% CPU-auslastung, bei mir also genau einen Kern. Scheint also die CPU zu bremsen.
Bis jetzt hatte ich die daten immer in einer Hash-Table. Das war bedeutend schneller -.-
 

Guybrush Threepwood

Top Contributor
Ich nehme an, es dass es mit der Indexierung zu tun hat. Die Datenbank sind sehr schnell, wenn Du auf Objekte über deren ID zurück greifst. Wenn Du andere Felder verwendest, dann geht es unter Umständen langsam, da die Datenbank komplett durchsucht werden muss. Es ist aber möglich, die Variablen indexieren zu lassen und das beschleunigt den Zugriff enorm.
 

Guybrush Threepwood

Top Contributor
P.S.: Wenn Du ohnehin die Datenbank nur im Speicher hälst, worin liegt dann eigentlich der Vorteil der Verwendung eines Datenbanksystems? Vielleicht gäbe es ja Datenstrukturen, die Deinen Anwendungszweck besser erfüllen als Derby.

P.P.S. Probieren mal H2 aus. Funktioniert es damit besser als bei Derby?

P.P.P.S.: CREATE INDEX statement
 

SteeL1942

Aktives Mitglied
P.S.: Wenn Du ohnehin die Datenbank nur im Speicher hälst, worin liegt dann eigentlich der Vorteil der Verwendung eines Datenbanksystems? Vielleicht gäbe es ja Datenstrukturen, die Deinen Anwendungszweck besser erfüllen als Derby.

Bis jetzt habe ich mit Hashtables und Listen gearbeitet. Das hat mich aber nicht so überzeugt. Hatte also für einen Datensatz ein eigenes Objekt erstellt, was dann in der Liste bzw Hashtable abgelegt wurde. Problem dabei ist halt nur, dass ich bei der Liste nach einem Kriterium sortieren muss und bei der Hashtable das Objekt ja mit einem parameter abgespeichert wird. Nur kann eben der Parameter, den ich zur Suche angebe, variieren. Ich kann zwar für jeden parameter ne extra Hashtable anlegen, aber bin mir nicht so sicher, ob das so zu "guten Stil" passt. Deswegen erschien mir eine Datenbank sinnvoller.

Mit dem Index werd ichs mal versuchen



EDIT: Mit dem Index hab ich jetzt 1000 Ergebnisse in 5 Sekunden. Das sieht doch gleich deutlich besser aus
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M MySQL probleme beim "Generate Tables from Entities" Datenbankprogrammierung 9
A Derby/JavaDB Probleme beim Einbinden Datenbankprogrammierung 2
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
N Probleme beim Aufruf aus der DB Datenbankprogrammierung 7
V Probleme beim Öffnen "einiger" SuperbaseTabellen p Datenbankprogrammierung 8
G Probleme beim Methodenaufruf einer EJB Datenbankprogrammierung 10
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
S JDBC-Anfänger und Probleme beim Treiberfinden etc. Datenbankprogrammierung 4
T Probleme beim Verbindungsaufbau zum SQL 2000 Datenbankprogrammierung 2
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
Kirby.exe Probleme mit docker-compose.yml Datenbankprogrammierung 4
B Probleme mit Datenbankverbindung Datenbankprogrammierung 2
N java SQL JAR - Probleme Datenbankprogrammierung 18
S probleme mit dem jdbc treiber Datenbankprogrammierung 1
T Oracle Probleme bei getTableName Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
D Probleme bei Einsteiger Aufgabe SQL Datenbankprogrammierung 2
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
H Probleme mit Unicodedarstellung in Derby DB Datenbankprogrammierung 1
L Probleme mit DriverManager.getConnection(..) - Endlosschleife, Java Absturz, Keine Exception Datenbankprogrammierung 4
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
W Probleme mit AND und OR Datenbankprogrammierung 5
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Gossi CallableStatement Probleme Datenbankprogrammierung 8
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
L Derby/JavaDB Derby macht Probleme Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
M Probleme mit Triggering Datenbankprogrammierung 2
F DB2 Probleme mit dem DriverManager Datenbankprogrammierung 4
S Derby/JavaDB OpenJPA, @oneToMany und Probleme Datenbankprogrammierung 2
I MySQL Probleme mit kyrillischen Zeichen Datenbankprogrammierung 2
S Probleme mit INSERT Befehl Datenbankprogrammierung 11
R isLast() Probleme bei Pervasive Datenbankprogrammierung 5
S Probleme mit localhost Datenbankprogrammierung 14
M Oracle Probleme mit dem anbinden einer Oracle 10g Datenbank Datenbankprogrammierung 27
P Hibernate -> Probleme bei n:m-Relation und JUnit Datenbankprogrammierung 10
J Probleme mit Datenbankzeiger Datenbankprogrammierung 19
A Probleme mit auf DB2 Express zugreiffen Datenbankprogrammierung 6
M Probleme bei Select in Schleife Datenbankprogrammierung 7
G Probleme mit Datenbankanbindung Datenbankprogrammierung 3
R Probleme mit Insert Datenbankprogrammierung 2
P Probleme mit Oracle Timestamp Datenbankprogrammierung 3
klattiator Hibernate - Probleme bei Konfiguration Datenbankprogrammierung 3
F Probleme mit entfernter DB und Hibernate Zeichensatz Datenbankprogrammierung 3
G Probleme mit der Schnittstelle H1bernate/Eclipse Datenbankprogrammierung 6
A Probleme mit Jar-File in ein Jar-File Datenbankprogrammierung 8
O Derby Performance Probleme? Datenbankprogrammierung 4
ARadauer hibernate probleme Datenbankprogrammierung 13
Y Probleme mit H2 und Primary Key Datenbankprogrammierung 4
D Probleme mit mysql-Connection Datenbankprogrammierung 10
G INNODB backup probleme Datenbankprogrammierung 2
S Probleme mit statement.close() Datenbankprogrammierung 10
G Probleme mit Laden des JDBC-Treiber in HSQLDB Datenbankprogrammierung 2
T Probleme mit Date in H2 Datenbank Datenbankprogrammierung 2
4 Probleme mit Select abfrage Datenbankprogrammierung 4
N Probleme mit Access-DB bei einem Webserver Datenbankprogrammierung 5
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
R Probleme mit Datensätzen in MySql DB Datenbankprogrammierung 3
B Oracle Driver Probleme Datenbankprogrammierung 2
I Probleme bei MySQL - Replikation Datenbankprogrammierung 2
R Probleme mit ausführbarem Jar Archiv Datenbankprogrammierung 9
F Probleme mit Jar Datei Datenbankprogrammierung 3
S String probleme Datenbankprogrammierung 3
R Probleme mit der Verbindung zum localhost Datenbankprogrammierung 12
S Probleme bei der Installation von MySQL 5.0 Datenbankprogrammierung 4
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
G Probleme mit Access und Join Datenbankprogrammierung 3
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Probleme mit Datenbankeinträge Datenbankprogrammierung 4
G Probleme mit Treiber (connector) Datenbankprogrammierung 20
thE_29 getBytes() - russland/bulgarien -- andere Codecs Probleme Datenbankprogrammierung 8
E Probleme mit JDBC und Executable-Jar Datenbankprogrammierung 2
G Probleme mit MySQL - Anmeldung Datenbankprogrammierung 2
P Probleme mit NullPointerException Datenbankprogrammierung 5
K MySQL: Probleme mit dem Verbinden per IP-Adresse Datenbankprogrammierung 6
T Probleme mit Datenbank Datenbankprogrammierung 6
Kirby.exe Verwirrung beim Query Datenbankprogrammierung 4
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4
C Oracle Fehler beim list.add() Datenbankprogrammierung 5
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
T MySQL Multithreading beim Datenbankzugriff Datenbankprogrammierung 3
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
J Datentyp der Spalte beim Datenbankdesign unbekannt Datenbankprogrammierung 12
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
N HSQLDB Problem beim Treiberladen im Jar Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
M Datenbankverbindung zu langsam beim Insert? Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben