Ich war überrascht, wie einfach es ist, mit Java auf einer SQLite-Datenbank zu arbeiten. Man muss lediglich einen SQLite JDBC Treiber (z.B. sqlitejdbc-v056.jar oder Xerial SQLite JDBC Driver) in seinem Java-Projekt hinzufügen und dann diesen Beispiel-Code ausführen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db"); Statement stat = conn.createStatement(); stat.executeUpdate("drop table if exists people;"); stat.executeUpdate("create table people (name, occupation);"); PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);"); prep.setString(1, "Gandhi"); prep.setString(2, "politics"); prep.addBatch(); prep.setString(1, "Turing"); prep.setString(2, "computers"); prep.addBatch(); prep.setString(1, "Wittgenstein"); prep.setString(2, "smartypants"); prep.addBatch(); conn.setAutoCommit(false); prep.executeBatch(); conn.setAutoCommit(true); ResultSet rs = stat.executeQuery("select * from people;"); while (rs.next()) { System.out.println("name = " + rs.getString("name")); System.out.println("job = " + rs.getString("occupation")); } rs.close(); conn.close(); } } |
Daraufhin wird beim erstmaligen Aufruf eine Datenbank namens “test.db” im Projekt-Ordner angelegt und eine Tabelle “people” mit den Spalten “RecNo”, “name” und “occupation”. In diese Tabelle werden weiterhin drei Datensätze geschrieben. Doch Vorsicht! Beim erneuten Ausführen des Codes wird die Tabelle wieder gelöscht und neu angelegt (siehe Code-Zeile 14). Wer die SQLite-Datenbank genauer betrachten möchte, dem empfehle ich das Werkzeug SQLite Expert, welches in der “Personal Edition” sogar kostenlos ist!
Vor wenigen Tagen wurde der Spiele-Service von Skype geändert und wer dieses Update bestätigt hat, der bekommt beim Start von Skype die Skype Extras zusammen mit Skype Games. Bei mir verursachen die Skype Games jedoch nur Probleme, weshalb ich beim Starten des beliebten Messengers solche kuriosen Fehlermeldungen erhalte:
Dieser Mist lässt sich verhindern, wenn man im Skype-Menü auf “Aktionen – Optionen – Erweitert” klickt und dort das Häkchen bei “Extras automatisch starten” abwählt. Man sollte auch bei “Zugriffsverwaltung (externe Anwendungen)” den Eintrag von “EasyBitsGO.exe” entfernen.
Seit heute besitze ich mit der LaCie minimus 2 TB meine dritte USB 3.0-Festplatte. Schon erstaunlich, wie viel Speichermasse (2 Terrabyte!) man für 86,90 EUR im Laden heutzutage bekommen kann. Die LaCie minimus gefällt mir besonders aufgrund ihres schicken Designs. Mit einem robusten Aluminiumgehäuse kommt das gute Stück daher. Die Festplatte besitzt auch einen An-/Ausschalter und eine blaue LED-Leuchte, die anzeigt, ob die Festplatte gerade arbeitet.
Was mich verwundert ist das USB-Kabel, denn die minimus kommt mit einem Mikro USB 3.0-Stecker daher, was eher untypisch für 3,5 Zoll Festplatten ist. Trotzdem können sich die Datenraten sehen lassen! Mit 100.7 MB/s im Lesen und 87.65 MB/s im Schreiben ist die LaCie minimus ganz oben mit dabei. Zwar nicht ganz so schnell wie meine Buffalo DriveStation HD-HXU3 aber schneller als meine Samsung STORY Station 3.0. Für alle Anhänger der harten Fakten gibt es die Benchmark-Ergebnisse im Anhang. Ich habe die Festplatte auch mal an einen USB 2.0-Port gehangen, damit man mal sieht, was man mit USB 2.0 verpasst. …weiterlesen
Wer sich mit dem SQL-Skript aus dem MySQL Cursor Beispiel beschäftigt hat wird festgestellt haben, dass der dort definierte Trigger check_amount nur funktioniert, wenn nicht mehr Produkte bestellt werden, als insgesamt überhaupt in allen Geschäften (engl. stores) verfügbar sind. Im Beispiel-Skript gibt es insgesamt 550 Fernseher:
1 2 3 4 | -- Insert some products INSERT INTO products(prod_id,name,store,stock) VALUES (NULL,'Fernseher','Berlin',250)$ INSERT INTO products(prod_id,name,store,stock) VALUES (NULL,'Fernseher','Potsdam',200)$ INSERT INTO products(prod_id,name,store,stock) VALUES (NULL,'Fernseher','Bremen',100)$ |
Wird nun die folgende Anfrage gestellt, dann werden mehr als 550 Fernseher bestellt und es kommt zu einem Trigger-Fehler:
1 | INSERT INTO orders(user_id,product,amount) VALUES (1,'Fernseher',1300)$ |
Um diesen Fehler zu beseitigen, habe ich den …weiterlesencheck_amount-Trigger erweitert, so dass eine Stored Procedure namens availableQuantity abgefragt wird, welche dann Auskunft darüber liefert, wie hoch die verfügbare Anzahl eines Produktes ist. Ist diese Anzahl kleiner als die bestellte Menge, dann wird die bestellte Menge einfach auf die maximal verfügbare Anzahl gesetzt.
Cursor dienen im Zusammenhang mit relationalen Datenbanken dazu, um das Impedance Mismatch auszugleichen. Das Impedance Mismatch entsteht durch den Unterschied von Programmiersprache und Datenbanksprache. Programmiersprachen arbeiten mit einzelnen Tupeln und relationale Datenbanken mit Mengen von Tupeln. Der Cursor ermöglicht es nun, die Ergebnismenge einer Datenbankabfrage in einzelnen Tupeln zu verarbeiten. Durch das Schlüsselwort FETCH sorgt dafür, dass das nächste Tupel aus der abgefragten Menge herangezogen wird. Um das zu veranschaulichen, habe ich das Beispiel aus dem MySQL-Trigger Beitrag um eine Tabelle mit Produkten (products) und eine Tabelle mit Bestellungen (orders) erweitert.
Aus Zeitgründen kann ich dieses Beispiel im Moment nicht erklären. Ich werde dazu aber später ein Video machen und hoffe, dass bis dahin der Code zur Verständigung ausreicht. …weiterlesen
SQL-Trigger werden zur Überwachung von semantischen Integritätsbedingungen eingesetzt. Trigger bilden dabei eine einfache Form von ECA-Regeln. ECA steht für “Event, Control, Action” und definiert in Zusammenhang mit Datenbanken eine Aktion, die nach der Kontrolle eines Ereignis ausgeführt werden soll.
Zur praktischen Veranschaulichung habe ich ein MySQL-Skript mit drei Tabellen und einem Trigger geschrieben. In der Tabelle “users” können Benutzer mit einem Vor- und Nachnamen eingetragen werden. Der im Skript definierte Trigger führt nach dem Eintragen in die “users”-Tabelle einen Stringvergleich aus und schreibt alle Benutzer, deren Nachname nicht mit einem Buchstaben größer “N” anfängt in die “users_a_m”-Tabelle. Alle Benutzer, deren Nachname mit einem “N” oder größer beginnt, werden in die Tabelle “users_n_z” kopiert.
Mein Beispiel demonstriert neben dem definierten After-Trigger auch noch eine Möglichkeit zur Datenbank-Skalierung. Man könnte nämlich die Tabellen “users_a_m” und “users_n_z” auf verschiedene Datenbank-Server auslagern und beim Lesen von Datensätzen die entsprechende Datenbank anfragen (je nachdem mit welchem Anfangsbuchstaben der Nachname des gesuchten Benutzers anfängt). Dies hätte den Vorteil, das die Datenbank-Anfragen verteilt werden und die Anfrage-Last nicht auf eine einzige Datenbank trifft. …weiterlesen


1