martedì 15 dicembre 2009

Usare HSQLDB embedded in un progetto java

Translation made by me from source(Thanks to the author).
Italic text is my comment.

HSQLDB è un rapido, piccolo e robusto DBMS relazionae(RDBMS) scritto in java. HSQLDB offre un'implementazione del database sia in modalità in-memory sia in modalità disk-based(NdT spiegate meglio dopo).
Ovviamente potrete usarlo anche nella modalità classica ed installarlo sulla vostra macchina server e collegarvi con la vostra applicazione come client. Ma questo lo fanno tutti i DB e non avrei avuto motivo di scrivere questo post. Embedded significa che il DBMS verrà eseguito insieme alla vostra applicazione quindi non avrete bisogno di installarlo sulla macchina. Utile vero?

HSQLDB è piccolo abbastanza da essere incluso in una applicazione senza grandi sforzi ed è attualmente usato da molte applicazioni tra le quali le più famose sono OpenOffice, Jboss, Jira e Mathematica.
Scaricatelo ed estreatelo dalla pagina di download del sito.

Includere HSQLDB è semplice: basta aggiungere il file hsqldb.jar al tuo class path. Usando Eclipse basta cliccare sul proprio progetto con il destro e selezionare proprietà. Poi Librerie->Aggiungi un jar esterno e selezionate il file hsqldb.jar. Scaricando l'archivio dal sito trovere questo file dentro la sottocartella "lib". Una volta che avete impostato questo potrete caricare il driver HSQLDB come qualunque JDBC driver.

Class.forName(”org.hsqldb.jdbcDriver”);
Boh a me funziona anche senza questa riga(che tra l'altro necessita di almeno un try catch)

Una volta registrato il driver, ci si può connettere al DB HSQL come si farebbe con qualsiasi altro motere JDBC. E' difficile da credere ma questo è tutto quello che si deve fare per includere il database in una applicazione Java!
Ci si può connettere al DB HSQL in 2 modi: come in-memory database o persisted-file-based database

Come in ogni in-memory database, il tuo DB esisterà solo mentre l'applicazione è in esecuzione. Quando l'applicazione viene avviata nuovamente, si avrà bisogno di ricreare tabelle e di inserire i record per ricreare il DB. Un database in-memory è utile solo se la perdita di dati non è importante. Per crearlo bisogna usare il codice seguente.

String url = “jdbc:hsqldb:mem:database_name”;
String user = “sa”;
String password = “”;
Connection c = DriverManager.getConnection(url, user, password);
Se si vuole che i dati siano memorizzati e persistenti dopo che l'applicazione è terminata si avrà bisogno che il DB HSQL salvi i dati su disco. Per creare un DB file-based si userà un url JDBC come il seguente.

String url = “jdbc:hsqldb:file:/path/to/database/file”;
String user = “sa”;
String password = “”;
Connection c = DriverManager.getConnection(url, user, password);
Puoi usare anche un percorso relativo. In questo caso i file del DB verrano inseriti a partire dalla directory dove il processo JAVA ha inizio.

Una volta che la connessione JDBC al DB HSQL è stata creata si può iniziare a creare tabelle e inserire dati come si farebbe normalmente in JDBC.

Necessiterete ovviamente dell'import di
java.sql.*;
per connettervi e fare tutte le varie operazioni.

5 commenti:

  1. Ottimo!
    Chiaro e conciso,complimenti!

    RispondiElimina
  2. Salve,
    Ho usato il metodo con il quale i dati siano persistenti. Però non visualizzo da nessuna parte i file che crea..
    Il codice che ho usato è il seguente :

    "jdbc:hsqldb:file:/database/;ifexists=true"
    Quindi dovrebbe mettere i file all'interno della cartella "database" che è nel percorso relativo.
    Suggerimenti ?

    RispondiElimina
  3. Beh ti basta osservare la directory del progetto. E' stata creata una cartella 'database'?
    Se no i dati sono comunque persistenti?
    Se i dati vengono salvati ma tu non sai dove prova a controllare con il debug viene creato quel file.
    In caso di non persistenza dei dati è probabile che tu abbia sbagliato la stringa della connessione. Ricontrollala.

    Saluti

    RispondiElimina
  4. Credo sia necessario usare la query SHUTDOWN per completare l'inserimento dei valori e le altre operazioni su DB.

    statement.executeUpdate("SHUTDOWN;");

    RispondiElimina