Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

HyperSQL: mettere in esercizio un database in tempi rapidi

Primi passi con HSQLDB: installazione, esempi introduttivi, modalità d’utilizzo di base e esempi di utilizzo in programmi Java.
Primi passi con HSQLDB: installazione, esempi introduttivi, modalità d’utilizzo di base e esempi di utilizzo in programmi Java.
Link copiato negli appunti

Introduzione a HyperSQL

HSQLDB (HyperSQL DataBase) è un RDBMS (Relational DataBase Management System), un DBMS basato sul modello relazionale scritto interamente in Java, gratuito e distribuito con una licenza simile alla BSD, compatibile con le principali licenze open source. Le prime versioni erano basate sull’Hypersonic SQL Project, per poi evolvere per conto proprio in quelle succesive.

HSQLDB offre un motore compatto (la versione 2.2.9 è rilasciata in meno di 8 megabyte), veloce e multithread, con capacità di lavorare in modalità in-memory o disk-based, mettendo a disposizione delle applicazioni sia un supporto interno, che basato su server. Include un potente SQL tool a linea di comando e semplici interfacce grafiche.

Supporta inoltre high performance 2PL (2-phase locking), il MVCC (MultiVersion Concurrency Control) ed è facilmente portabile.

In questo articolo si mostreranno i primi passi con HSQLDB, partendo dall’installazione (come vedremo estremamente semplice e rapida, sia per sistemi operativi Windows che Linux), passando per esempi introduttivi e modalità d’utilizzo di base e concludendo con esempi di utilizzo in programmi Java. L'obiettivo è mettere in esercizio un database relazionale in tempi decisamente ristretti, di modo da poterlo utilizzare in supporto allo sviluppo di altre applicazioni o per far pratica con altri framework, come JPA.

L'articolo è costituito dalle seguenti sezioni:

  1. Precondizioni
  2. Installazione e primo avvio
  3. Esempi introduttivi e modalità di base
  4. L'utilizzo in Java
  5. Conclusioni

Precondizioni

Assicurarsi di avere correttamente installato sul computer il Java Development Kit (JDK 1.1 o successiva o una qualunque J2SE). Si assume che sia stata correttamente impostata la variabile d’ambiente JAVA_HOME e aggiornato il Path di sistema.

É inoltre utile avere conoscenze basiche sull’argomento, quindi occorre aver affrontato l’argomento SQL, consigliamo la lettura della Guida al Linguaggio SQL.

Installazione

Per prima cosa occorre effettuare il download dell’archivio zip presso il sito http://hsqldb.org/. Questo articolo fa riferimento alla versione 2.2.9, ma per quanto riguarda i primi passi non si segnalano sostanziali cambiamenti con le versioni precedenti. Effettuato il download è possibile decomprimere l’archivio direttamente in C: (o nella home/user/ per Linux).

A questo punto è già possibile avviare HSQLDB. É possibile avviarlo in diverse modalità che affronteremo successivamente, per ora cominceremo con la modalità server. É utile ma non necessario esportare il classpath relativo alla directory HSQLDB_HOME. É possibile in alternativa creare uno script d’avvio, lo possiamo chiamare Start_DB.bat (o Start_DB.sh in Linux) e posizionare direttamente nella cartella hsqldb, in modo da non dover aprire ogni volta il prompt dei comandi.

Il comando da immettere è, per sistemi Windows:

@java -cp ./lib/hsqldb.jar org.hsqldb.server.Server

Sistemi Linux:

#!/bin/bash
xterm -e /bin/bash -l -c 'java -cp ./lib/hsqldb.jar org.hsqldb.server.Server;'

Creazione del file di properties

Prima di avviare il server, passiamo alla realizzazione di un file di properties. Lo scopo di questo file è quello di indicare al server quali Database inizializzare (se ancora non presenti) e avviare. Il file, chiamato server.properties, va posizionato nella cartella hsqldb, e inizialmente popolato con:

server.database.0=file:hsqldbfold1/db1
server.dbname.0=testdb1
server.database.1=file:hsqldbfold2/db2
server.dbname.1=testdb2

Primo avvio

Avviato lo script, il risultato sarà la creazione di due nuove cartelle, hsqldbfold1 e hsqldbfold2, ognuna contenente al suo interno i file di un database, il cui nome è specificato da db1 e db2. I nomi testdb1 e testdb2 costituiscono invece degli alias, utilizzati per accedere ai database da Url. Viene poi indicata la porta di ascolto dei database. I file generati servono a specificare le properties, oltre che ad immagazzinare dati e log. Si è accennato in precedenza alla portabilità semplificata: volendo esportare il database infatti non occorre fare altro che copiare e incollare altrove la cartella generata con all’interno i file del database.

Avvio del server del database

Come indicato dall’output mostrato, è possibile arrestare il server premendo i tasti Ctrl+c. É possibile inizializzare e avviare un database anche a riga di comando. In caso di conflitto con quanto specificato nel file di properties ha la precedenza quanto passato a riga di comando, ed è comunque possibile aggirare il file di properties (e conseguentemente non avviare tutti i database descritti nel file), digitando il seguente comando:

@java -cp ./lib/hsqldb.jar org.hsqldb.server.Server -database.2 file:singledbfolddb3 -dbname.2 -testdb3 --props noproperties

In realtà quanto fatto è un piccolo trucco che dà un’indicazione sbagliata circa il file di properties da caricare, file che non esiste (verrà pertanto segnalato il messaggio Could not load properties from file). In tal caso il compilatore si limiterà ad avviare (ed eventualmente a inizializzare) il database che è stato passato a riga di comando.

Per attivare l’help in linea con la descrizione delle opzioni utilizzare il comando:

@java -cp ./lib/hsqldb.jar org.hsqldb.server.Server--help

Ora, disattivato qualsiasi server avviato, riavviamo tramite lo script Start_DB i database impostati nel file di properties. Terminato l’avvio, possiamo esplorare la cartella bin dove è possibile trovare alcuni script di avvio. Tra questi script vi è il runManagerSwing, il cui scopo è avviare il Database Manager, una semplice interfaccia basata sul framework Swing. Questa interfaccia ci consentirà di esplorare il contenuto dei database e di eseguire degli statements per popolarlo o interrogarlo.

Gli script sono per sistemi Windows. Per sistemi Linux è possibile creare un altro script nella medesima cartella. Lo possiamo chiamare runManagerSwing.sh e popolarlo nel seguente modo:

#!/bin/bash
xterm -e /bin/bash -l -c ‘java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing;’

Avviato lo script runManagerSwing verrà automaticamente avviata l’interfaccia di connessione a un database.

Database Manager e connessione a un db

Occorrerà fornire i parametri per la connessione a uno dei database avviati dal server. Come mostrato nell’immagine, impostiamo:

  • tipo: HSQL Database Engine Server
  • URL: jdbc:hsqldb:hsql://localhost/testdb1

Possiamo quindi dare l’ok. Verrà avviata la connessione al database db1 che, essendo per ora vuoto, mostrerà solo la cartella Properties.

Impostazione della password

Come è possibile notare, non abbiamo fornito password e abbiamo lasciato invariato lo username. É possibile impostarli direttamente nel file di properties, ad esempio:

server.database.2=file:hsqldbfold3/db3;user=testsa;password=pwd
server.dbname.2=testdb3

Ma non è propriamente sicuro come sistema, può andar bene giusto per fare alcuni test senza la preoccupazione di dimenticare la password.
É possibile invece, una volta connessi al database, modificare la password con il comando

ALTER USER SA PASSWORD "pwd"

Dove SA è il nome dell’utente (nel nostro caso l’utente standard).

Esempi introduttivi e modalità di base

HSQLDB supporta lo standard SQL:2011 core e buona parte delle estensioni presenti in SQL:2011 optional features. Per mostrare le funzionalità basiche dell’interfaccia, effettuiamo la connessione con il database db1. É possibile farlo anche se si è già aperto il Database Manager per connettersi a un altro database, basterà premere sul pulsante File/Connect e fornire i parametri di connessione come fatto in precedenza.

A questo punto possiamo creare la prima tabella. Premendo su Command/CREATE TABLE vedremo dei cambiamenti nelle finestre di destra. Nella finestra in basso verrà visualizzata la sintassi del comando, mentre nelle finestra in alto ne verrà visualizzata la parte iniziale che completeremo nel seguente modo:

CREATE TABLE persona(
	id INTEGER PRIMARY KEY,
	nome VARCHAR(50) NOT NULL,
	cognome VARCHAR(50) NOT NULL
)

Premuto il pulsante Execute SQL verrà creata la corrispondente tabella Persona.

Query

L’interfaccia fornisce alcune utili opzioni, ad esempio premendo con il tasto destro sopra la tabella vedremo attivarsi un menù con alcuni statements, dal Select All all’Insert.

Inseriamo una tupla con i seguenti valori:

INSERT INTO "PUBLIC"."PERSONA"
	( "ID", "NOME", "COGNOME" )
	VALUES ( 1, 'Pippo', 'De Pippis')

Dopo aver eseguito lo statement (tasto Execute SQL) possiamo lanciare una query Select All per vedere che la tabella è stata effettivamente aggiornata.

Nel caso di inserimento di tabelle da programmi esterni per vedere le nuove tabelle è necessario effettuare un refresh (View/Refresh Tree).

Svolti i primi esempi e preso dimestichezza con l’interfaccia, possiamo mostrare alcune delle modalità d’avvio basiche offerte da HSQLDB.

Modalità di base

Nella prima connessione al database abbiamo utilizzato superficialmente alcune opzioni. Abbiamo utilizzato infatti la modalità server, vedremo ora cosa implica e quali sono le altre possibilità:

  • In-Memory: non prevede persistenza, un database viene allocato per intero nella RAM. il formato dell’URL è jdbc:hsqldb:mem:NODENAME
  • Standalone Engine: utilizza solo i file senza consumo di risorse di rete. Previsto per un accesso diretto da parte dei programmi che lo utilizzano. Il database engine viene eseguito come parte dell’applicazione che lo utilizza con il risultato di favorire accessi rapidi ma impedendo l’accesso a tool esterni finché l’applicazione è in esecuzione. Formato dell’URL: jdbc:hsqldb:NODEPATH/NODENAME
  • Server Engine e WebServer Engine: queste sono le modalità d’avvio con il massimo dell’accessibilità. Sono possibili accessi multipli da programmi sullo stesso computer o da altri sulla rete. Nella modalità HSQL Server viene utilizzato un protocollo proprietario (generalmente in ascolto sulla porta 9001/tcp), mentre nella modalità HTTP Server è utilizzato il protocollo HTTP (porta 80). Vi è anche un’ulteriore modalità, HTTP Servlet, utilizzata quando un servlet engine o un application server fornisce accesso al database. Questa modalità può servire però solo un database.

In generale, si predilige la modalità server finché le applicazioni sono in fase di realizzazione.

Formato dell’URL:

  • server engine: jdbc:hsqldb:hsql://NODENAME
  • webserver engine: jdbc:hsqldb:http://NODENAME

Startup command:

  • java org.hsqldb.server.Server
  • java org.hsqldb.server.WebServer

É prevista la possibilità di combinare le modalità in-memory e server.

L'utilizzo in Java

In questa sezione si mostrano esempi di base per l’utilizzo del database con programmi scritti in Java. Per la connessione, è necessario importare i driver JDBC contenuti nel file hsqldb.jar, aggiungendo il jar al classpath del progetto. Il file si trova nella cartella hsqldb/lib.

Connessione in modalità Server

In questo primo esempio si effettua una prova di connettività e di avvio del database db1 in modalità server. Si assume che non sia avviato in contemporanea un altro server. Se invece si vuole fare una prova con il server avviato esternamente, è possibile commentare il codice relativo alla classe Server. Nel seguito dell’esempio si testano anche alcuni statements SQL.

package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import org.hsqldb.server.Server;
public class ServerModeConnection {
	public static void main(String[] args) { 
		Server hsqlServer = new Server();
		hsqlServer.setDatabasePath(0, "file:C:/hsqldb-2.2.9/hsqldb/hsqldbfold1/db1");
		hsqlServer.setDatabaseName(0, "testdb1");
		hsqlServer.start(); 
		try {
		Class.forName("org.hsqldb.jdbcDriver");
		Connection connection = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost/testdb1","sa","");
			connection.prepareStatement("DROP TABLE tabtest IF EXISTS;").execute();
			connection.prepareStatement("CREATE TABLE tabtest (id INTEGER, name VARCHAR(50));").execute();
			connection.prepareStatement("INSERT INTO tabtest(id, name) VALUES (1, 'Pippo');").execute();
		ResultSet res = connection.prepareStatement("SELECT * FROM tabtest;").executeQuery(); 
		while(res.next()){
			System.out.println("Id: "+res.getInt(1)+"nName: " + res.getString(2));
		} 
		connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		hsqlServer.stop();
	}
}

Connessione in modalità In-Process (Standalone)

Rispetto all’esempio precedente non c’è la necessità di avviare un server (né da codice né esternamente), ma sarà necessario modificare i parametri della connessione che diventeranno:

Connection connection = DriverManager.getConnection( "jdbc:hsqldb:file[path]/hsqldbfold1/db1","sa","");

É possibile fare dei test osservando che, al contrario del caso precedente, finché un programma mantiene attiva la connessione al database non è possibile lanciare tool come il runManagerSwing.

Connessione in modalità In-Memory

Questo esempio è molto simile al precedente con la differenza che viene creato un database ad-hoc in memoria. Questo database non può essere acceduto da altri programmi e non è persistente.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:dbmem","sa","");

Conclusioni

In questo articolo si è introdotto un RDBMS, l’HyperSQL DataBase. Ve ne sono già molti in circolazione per cui una considerazione sull’effettiva utilità è d’obbligo, ma la risposta è affermativa e sta nelle dimensioni contenute, nell’immediatezza di installazione e di utilizzo, nella licenza, nella portabilità, oltre che nella possibilità di avviare i database direttamente dal codice Java.

Come abbiamo sperimentato nel corso dell’articolo, l’installazione richiede pochi minuti, tempi di download inclusi. É pertanto lo strumento ideale per supportare quelle applicazioni che non richiedono tutte le caratteristiche offerte da altri DBMS come MySQL, o semplicemente per fare un po’ di pratica con i database e/o con altri framework, come JPA.

Ti consigliamo anche