Awake SQL: accesso remoto
Awake SQL è un framework open source che permette l’accesso remoto a database mediante la combinazione dei protocolli HTTP-JDBC. Gli sviluppatori di applicazioni Java Desktop che hanno la necessità di accedere a db remoti in genere utilizzano una serie di invocazioni JDBC simili a quelle che utilizzerebbero se dovessero accedere ad un database locale, chiaramente la necessità di dover interagire con db remoti comporta la necessità di dover affrontare problematiche spesso molto diverse da quelle locali, per questa ragione Awake SQL viene fornito con un set completo di funzionalità tra le quali vanno ricordate :
- La gestione dei principali tipi di dati principali inclusi , anche blob / CLOB,
- Il supporto alle transazioni.
La sicurezza è stata presa in considerazione a partire dalla fase di progettazione: in particolare la componente server-side consente di specificare agli amministratori una serie di regole molto robuste legate all’autenticazione degli utenti nonché tutta una serie di norme volte a garantire la sicurezza e la protezione dei db.
Awake SQL è distribuito sotto la licenza GNU Lesser General Public (LGPL v2.1): si può usare gratuitamente e senza alcun vincolo nei progetti open source così come nelle applicazioni commerciali.
Perché Awake SQL?
L’obiettivo principale di Awake SQL è quello di rendere più veloce il codice necessario per accedere ai dati memorizzati su server SQL remoti.
A tal proposito giova ricordare che ogni richiesta avanzata da un nuovo client in genere richiede di espletare il seguente ciclo di azioni:
- Modifica il codice lato client al fine di gestire la nuova query oppure effettua un aggiornamento tramite l’HttpClient di Apache. Ciò significa che codificare una nuova azione del nostro protocollo client / server determinerà l’invio di nuovi parametri al server, il che implica la necessità di analizzare la risposta, gestire gli errori di comunicazione, gli errori delle applicazioni, ecc
- Sviluppare o modificare una Servlet (o classe REST) e il codice relativo alla nuova query SQL o un suo aggiornamento. La classe deve anche gestire la chiamate del client, analizzare i parametri e restituire il risultato sul flusso di output HTTP.
- Distribuire le classi server su Tomcat.
- Riavviare Tomcat.
- Avviare l’applicazione desktop lato client e provarlo.
- Torna al passo 1 se non funziona …
Per guadagnare in produttività, in Awake SQL si è in grado di aggiungere nuove richieste SQL e senza alcuna modifica o azioni lato server. Con Awake SQL, si è così in grado di garantire un ciclo molto più efficiente, nella gestione delle connessioni remote, nello specifico:
- Modifica l’applicazione client desktop al fine dir gestire la nuova query SQL o aggiornarla allo stesso modo di come si farebbe per una normale chiamata JDBC.
- Avvia l’applicazione desktop client e testala.
- Torna al passo 1 se non riesce …
E’ evidente come in questo nuovo ciclo di gestione la componente lato server non sia minimamente interessata da operazioni di modifica/aggiornamento legate alla nuova query SQL, non è più necessario testare/sviluppare il protocollo client / server , e non è necessario riavviare Tomcat, è quindi chiaro come l’intero ciclo di interrogazione risulti molto più snello ed efficiente.
Come funziona
Il Framework Awake SQL è composto da:
- Una client Library.
- Un Server Manager.
- Una serie di classi per la configurazione degli utenti che accedono in remoto
La libreria client è installata sul lato client (tipicamente un PC). L’applicazione client (tipicamente un Swing / JavaFX Desktop App) accede tramite le API che creano un’istanza Connection. Ogni dichiarazione JDBC viene poi inviata al Server Manager per l’esecuzione sulla macchina remota. L’esecuzione di ogni istruzione JDBC è condizionata dalle regole definite nelle classi con cui si sono definite si sono configurati le regole da applicare agli utenti che accedono ai dati.
Tutte le comunicazioni tra il PC e il server utilizzano il protocollo HTTP standard, sia utilizzando la porta 80 e 443 in quest’ultimo caso le comunicazioni potranno essere protetta da SSL / TLS.
Invio dei dati e Ottimizzazioni
Le tecniche utilizzate sono :
- Formato JSON per il trasporto dei dati in cui però si utilizzano il meno possibile le meta-informazioni tipiche di questo formato.
- Grandi quantità di dati, tipicamente ResultSet, Blobs / CLOB, sono trasferiti utilizzando file, questi però non vengono caricati in memoria sul client o sul lato server, ma si utilizzano tecniche di streaming per leggere e scrivere il loro contenuto.
- Il lato server è stateless: nessun utente o info di sessione sono memorizzati sul server. Questo permette di configurare SQL Awake con qualsiasi bilanciamento del carico http e servizi di failover.
Vediamo ora una serie di esempi in cui si illustra l’utilizzo di questo Awake-SQL.
Esempio 1 – Creazione di una connessione JDBC a un db remoto ed esecuzione di una SELECT
// Definizione della URL// Sarà utilizzata una connessione criptata per ogni operazione da e verso il server
String url = “//www.acme.org/AwakeSqlManager”; // Info per il login: String username = “myUsername”; char[] password = { ‘m’, ‘y’, ‘P’, ‘a’, ‘s’, ‘s’, ‘w’, ‘o’, ‘r’, ‘d’ }; // Creazione di una connessione JDBC con il db remoto Connection connection = new AwakeConnection(url, username, password); // Si utilizzerà la connessione Awake come una normale connessione JDBC // Definizione della query String sql = “SELECT CUSTOMER_ID, FNAME, LNAME FROM CUSTOMER ” + “WHERE CUSTOMER_ID = ?”; PreparedStatement prepStatement = connection.prepareStatement(sql); prepStatement.setInt(1, 1); ResultSet rs = prepStatement.executeQuery(); while (rs.next()) { String customerId = rs.getString(“customer_id”); String fname = rs.getString(“fname”); String lname = rs.getString(“lname”); System.out.println(“customer_id: ” + customerId); System.out.println(“fname : ” + fname); System.out.println(“lname : ” + lname); // Etc. } |
Esempio 2- Cancellazione di due record da un db remoto
int customerId = 1;// Creazione della connessione JDBC remota con il DB:
connection = new AwakeConnection(url, username, password, httpProxy); // Inizio della transazione connection.setAutoCommit(false); // L’intero set di operazioni sarà espletato in un’unica transazione try { // 1) elimina il cliente: String sql = “delete from customer where customer_id = ?”; PreparedStatement prepStatement = connection.prepareStatement(sql); prepStatement.setInt(1, customerId); prepStatement.executeUpdate(); prepStatement.close(); // 2) Cancellazione di tutti gli ordini per quel cliente : sql = “delete from orderlog where customer_id = ?”; PreparedStatement prepStatement2 = connection.prepareStatement(sql); prepStatement2.setInt(1, customerId); prepStatement2.executeUpdate(); prepStatement2.close(); // L’intero set di operazioni o sarà completato nell’ambito della transazione corrente o non // sarà completata affatto: connection.commit(); System.out.println(“Ok. Commit Effettuato sul Server remoto!”); } catch (SQLException e) { connection.rollback(); System.out.println(“Transazione non completata. Rollback effettuato sul server remoto!”); throw e; } finally { connection.setAutoCommit(true); } // FINE DELLa TRANSAZIONE |
Per tutti coloro che fossero interessati a proseguire lo studio di questo framework possono visitare i seguente link: AWAKE-SQL.
Commenti