Ho notato che la connessione ai database in alcuni casi crea un po’ di grattacapi ad alcuni collaboratori, per cui ho deciso di scrivere una piccola guida che pubblico anche qui.
Magari torna utile a qualcuno, non si sa mai.
Di solito il collegamento tra le applicazioni sviluppate con IDC e i DMBS è praticamente trasparente; una volta aggiunto un database nel progetto e pubblicata poi l’applicazione su un server di produzione, il modo in cui app e base dati comunichino è un aspetto che si può serenamente ignorare.
Le cose cambiano quando utilizziamo server MyCloud o, come nel mio caso, self-managed.
In questi casi è necessario compiere qualche passo in più e a volte, aggiungere anche un po’ di codice nell’app.
I modi per collegarsi ad un database in questi casi sono due:
- Utilizzare Cloud Connector (opzione valida solo per i server MyCloud)
- Collegare il database “a mano”, indicando poche righe di codice nei punti giusti dell’applicazione (opzione valida sia per server MyCloud che self-managed)
Cominciamo con l’uso di Cloud Connector… rimandando alle guide ufficiali di Progamma!
Le trovate qui:
e vi trovate descritto molto bene come installare, configurare e usare Cloud Connector.
Dopo aver risolto velocemente questo punto grazie alla documentazione ufficiale, passiamo a come collegarci ad un database da codice, direttamente dall’interno delle nostre applicazioni.
Anche se questo argomento è presente nella guida “I server di produzione”, conviene qui spendere qualche parola in più sul tema.
Per risolvere il nostro problema, poniamoci due domande: Come? e Dove?
La risposta alla prima domanda, la troviamo nelle guide.
Occorre ottenere l’istanza di default che rappresenta il database in un’applicazione con l’istruzione:
let db = App.<DataModelName>.getDefaultInstance(app);
e poi configurare l’accesso al database utilizzando l’istruzione:
db.setOptions(connectionOptions);
dove connectionOptions è un oggetto JSON contenente i parametri di connessione al database.
I parametri variano a seconda del tipo di server DBMS utlizzato, nella guida “I server di produzione” vengono forniti i dettagli per MySQL, Microsoft SQL e Oracle.
Il collegamento a PostgreSQL viene mostrato nella configurazione dell’application server di IDC tramite il file config.json ed è l’unico DBMS che si può utilizzare per il collegamento automatico tramite il framework IDC (che gira sotto nodejs sul nostro server).
Il vantaggio è che una volta configurato lì, poi ve ne dimenticate; il framework lo userà quando necessario.
Lo svantaggio è che potete averne solo uno per tutte le applicazioni che configurate in config.json.
Questo almeno fino a qualche versione fa del framework, oggi magari la situazione è cambiata, invoco l’intervento di Paolo Giannelli su questo punto (e su tutti quelli su cui vorrà dare un contributo ovviamente).
Se vi occorre collegare diverse applicazioni ognuna ad un suo specifico db o se una applicazione deve scegliere il db a cui collegarsi, ad esempio in base all’utilizzatore, allora anche il collegamento a PostgreSQL va impostato da codice attraverso istruzioni come queste:
let opts = {
"user" : "pippo",
"password" : "pluto",
"host" : "192.168.1.100",
"port" : 5432,
"database" : "paperinodb",
"connectionTimeout" : 30000,
"pool" : {
max : 100}
};
App.<DataModelName>.getDefaultInstance(app).setConnectionOptions(opts);
che impostano una connessione verso il server 192.168.1.100, porta 5432, database “paperinodb” con un tempo di timeout delle connessioni di 30 secondi e un massimo di 100 connessioni contemporanee.
Notare che setConnectionOptions non effettua il collegamento al DBMS ma ne imposta solo le opzioni di connessione. É il framework che decide quando collegarsi, usando quelle impostazioni.
Per completezza, faccio notare che il cambio di database all’interno delle applicazioni, è possibile farlo anche quando si utilizza Cloud Connector (e si può fare anche molto di più). Nella relativa guida trovate tutte le informazioni del caso.
Per rispondere alla seconda domanda invece, ossia dove configurare i parametri di accesso al DBMS, occorre moversi in base a cosa fa l’applicazione.
Nel caso di un’applicazione semplice, che non usa né il sistema di sincronizzazione, né risponde a richieste REST, lo si può fare nell’evento onStart dell’applicazione.
Per un’applicazione che comunica con una controparte “backend” via sincronizzazione ed utilizza solo la DO remota, l’accesso al DBMS è meglio configurarlo nell’evento sync.onConnect dell’applicazione remota a cui quella principale si collega.
Se l’applicazione deve reagire ad eventi REST, allora occorre ficcare le istruzioni di connessione nell’evento onCommand della stessa.
In caso di modalità miste, occorre definire i parametri di connessione in più punti, ad es. per un’applicazione che oltre a fornire un’interfaccia web risponde anche a query REST, occorre configurare l’accesso al DBMS sia nell’onStart che nell’onCommand.
Per i server MyCloud, dove è possibile utilizzare Cloud Connector (acquistandolo come servizio aggiuntivo), tutto questo non è necessario: configurati i parametri di connessione al server di database, è poi il framework a collegarsi quando necessario.
Resta però a carico del programmatore il cambio di connector: se la vostra applicazione deve cambiare db alla bisogna, il cambio va fatto da codice, sempre tenendo presente qual è il modello di comportamento dell’app ed eseguito nei punti più opportuni.
Tutto qui, la gestione dei collegamenti ai DBMS è molto semplice, anche se mi piacerebbe lo fosse ancora di più per i server self-managed, avendo magari la possibilità poterli definire a livello globale di progetto e che poi il framework fosse in grado di gestirseli da solo quando necessario (cambio del db al volo escluso ovviamente).
Magari un giorno lo sarà.