Bruce Momjian ha pubblicato un
breve articolo circa l'adozione di pl/Java.
I linguaggi
pl/
sono una serie di
bindings per utilizzare un linguaggio di programmazione differente dal "plain" SQL all'interno di una istanza PostgreSQL, ovvero lato server.
Pertanto
pl/java
altro non è che un binding per poter utilizzare il linguaggio Java direttamente all'interno del server PostgreSQL, ad esempio per la costruzione di trigger o stored procedures. Io stesso ho utilizzato in passato
pl/java
in produzione, e ho anche tenuto dei mini corsi e dei seminari sul suo utilizzo (si
veda ad esempio qui), nonché ho provato a
contribuire a minime porzioni di codice.
Pl/Java risulta abbastanza ostico rispetto ad altri linguaggi
pl/
, e ciò è dovuto alla natura di Java (non certo ai suoi limiti), in particolare alla fase di compilazione che richiede sempre:
- un deploy di una forza compilata del codice;
- un pezzo di codice collante SQL che possa "iniettare" le funzionalità Java dentro al server PostgreSQL.
Pl/Java si basa per scelta progettuale su
Java Native Interface (JNI), scelta abbastanza efficiente se si considera che il codice deployato risulta locale al server cluster e quindi non è necessario utilizzare chiamate remote (es. RMI). In modo coerente con le scelte architetturali di PostgreSQL,
pl/java
utilizza una virtual machine backend per ogni processo attivo, richiedendo quindi dei tempi di startup piuttosto lunghi (o diciamo piu' lunghi rispetto ad altri
pl/
).
L'implementazione di
pl/java
è elegante e interessante, permette la sincronizzazione dei thread su un mutex singolo e consente di interagire con gli oggetti di backend arrivando perfino a implementare una sorta di SQL MED del poveraccio.
Eppure
pl/java
non
sfonda, come nota appunto Bruce nel suo articolo.
Avendolo usato in produzione posso affermare che
pl/java
è fortemente condizionato dalla competizione con altri linguaggi
pl
, in particolare quelli di scripting. Effettivamente io stesso, ad un certo punto, ho modificato porzioni di codice abbastanza sostanziose per passare da
pl/java
a
pl/perl
. Ovviamente ciò è stato possibile perché potevo scrivere codice in entrambi i linguaggi, competenza non sempre presente, e l'esigenza principale è stata quella di dover garantire una modifica
on-the-fly al codice sorgente anche quando non fosse disponibile un ambiente di sviluppo completo. Detto in due parole: per usare
pl/java
occorre impostare un progetto (Eclipse o similare), compilare, deployare e "iniettare" il codice nel backend, in
pl/perl
basta un editor di testo per modificare il codice e la fase di deploy si riduce ad iniettare il codice nel backend.
Personalmente ritengo che
pl/java
sia uno strumento interessante e importante, e che la sua adozione in contesti fortemente Java-based (per competenze, librerie, stack) sia opportuna, ma solo da un punto di vista degli sviluppatori. Difficilmente un DBA utilizzerà
pl/java
per implementare le proprie logiche di controlle server-side.