una strana coppia? - Oracle Italia by Massimo Ruocchio

F O
C
U
S
Open Source
Il boom dell’Open Source ha imposto ai colossi
dell’informatica di considerare questi particolari
prodotti alla stregua dei software convenzionali.
Oracle non si è fatta pregare, vediamo cosa è
venuto fuori da questo connubio
Oracle
Oracle ed
Open Source
una strana coppia?
[email protected] di Massimo Ruocchio
È laureato in matematica ed è certificato Oracle
Application Developer. Si occupa di analisi, progettazione e sviluppo di applicazioni software.
P
40
CP 112
ochi anni fa il software open source era
considerato “roba da smanettoni”. Nessuno immaginava che questa filosofia
avrebbe, in così poco tempo, varcato i
cancelli delle più grandi industrie di informatica
al mondo.
La svolta si è avuta quando le grandi corporate si
sono rese conto di poter essere tagliate fuori da una
grossa fetta di mercato. Si stava facendo strada,
infatti, il cosiddetto “paradigma LAMP” (Linux
come sistema operativo, Apache come web server,
MySQL come database e Perl come linguaggio di
scripting) tutto basato sulla filosofia open source. A
quel punto c’erano solo due possibilità: scendere
allo stesso piano delle applicazioni open source
e combattere oppure farsele amiche. Oracle ha
scelto, nella maggior parte dei casi, la seconda
possibilità. In quest’articolo vedremo come Oracle
ha cercato non di battere, ma di entrare a far parte
del “paradigma LAMP”. Parleremo delle partnership con Linux e Apache, dell’integrazione con
Perl e della guerra dichiarata ai (dai) database
open source.
Oracle e Linux
La svolta nelle relazioni tra Oracle e l’open
source si è verificata nel Luglio del 1998. Durante
l’Open World, Oracle annunciò al mondo il rilascio imminente della versione 8i per Linux. Il rilascio avvenne effettivamente il 7 di Ottobre del
1998. Contestualmente Oracle cominciò a distribuire gratuitamente le personal edition dei suoi prodotti. Il passo più importante verso il mondo dell’open source era stato fatto.
Gli “smanettoni”, tutti rigorosamente muniti di
workstation Linux, potevano liberamente scaricare il database Oracle ed utilizzarlo per le loro
applicazioni open source. Di più: Oracle riconosceva a Linux, costruito da un gruppo di ragazzi e
distribuito gratis in Internet, pari dignità rispetto
agli altri sistemi operativi prodotti secondo i processi classici di ingegneria del software e venduti a
prezzi molto salati.
Dal punto di vista tecnico la versione Linux di
Oracle è molto simile alla versione per Unix. Per
i DBA che lavorano con Linux c’è la difficoltà,
rispetto a quelli che lavorano con NT, di non avere
a disposizione uno strumento grafico che li aiuti nel
loro mestiere. Tutto va fatto da linea di comando.
Di contro c’è il vantaggio di poter amministrare il
sistema da remoto senza dover sedere obbligatoriamente alla console. Sotto Linux Oracle viene eseguito in processi separati. Ciò causa una leggera
perdita di performance ma garantisce una maggiore
sicurezza nelle transazioni con conseguente maggiore integrità dei dati coinvolti. Se il prodotto che
si sta installando è Oracle 9i Application Server, su
Linux (e su Unix) si ottengono performance decisamente migliori che su NT. Ciò grazie alla maggiore
velocità del web server Apache (che viene utilizzato
da Oracle9iAS, come vedremo nel prossimo paragrafo) sui sistemi che utilizzano più processi paralleli
anziché più thread nello stesso processo.
Infine Linux su sistemi a 32 bit ha la limitazione
della dimensione massima dei file di due gigabyte.
Questo può influenzare la creazione dei datafile
da associare ai tablespace, ma non è un grosso
problema. Infatti in Oracle è possibile associare
più datafile allo stesso tablespace. In ogni caso su
sistemi a 64 bit non ci sono limitazioni pratiche nel
dimensionamento dei file.
A quanto pare la strategia di Oracle è stata
premiata. La rivista Linux Journal (http://
www.linuxjournal.com) ha eletto Oracle miglior
database per Linux per l’anno 2001. Nel 2000 il
premio era andato a PostgreSQL, un database open
source di cui parleremo più avanti.
5. La procedura PL/SQL genera una pagina HTML
utilizzando i dati e PL/SQL Web Toolkit;
6. La risposta è inviata a PL/SQL Gateway;
7. Il web server invia la risposta al client.
PL/SQL Web Toolkit è un insieme di package che
consentono di costruire una pagina HTML con i
dati presenti sul database. DAD sta per Database
Access Descriptor, un DAD contiene le informazioni su come connettersi ad un database: DNS
name, username, password e connect string.
FIGURA 1 I passi che si realizzano quando il server riceve una
richiesta da soddisfare con PL/SQL Gateway
Oracle ed Apache
Dopo avere aperto le porte al mondo dell’open
source realizzando una versione del database per
Linux, Oracle è andata molto oltre includendo un
prodotto open source nel proprio software. Con
il rilascio di Oracle 9i Application Server, infatti,
Oracle ha abbandonato il vecchio web server Spyglass
sostituendolo con il web server open source Apache.
Perché? Semplice: Apache è migliore di Spyglass!
Oracle9iAS con Apache è fino ad 8 volte più veloce
della precedente versione con Spyglass. Già la precedente versione di OAS era compatibile con Apache,
ma molti preferivano comunque utilizzare Spyglass
perché era fornito insieme all’Application Server.
L’architettura di Apache si presenta in forma
“modulare”, Oracle9iAS fornisce vari moduli Apache
per Java 2, SSL, PL/SQL, Perl, CGI ecc… In particolare è interessante dare uno sguardo al modulo
Apache per il PL/SQL denominato MOD_PLSQL.
MOD_PLSQL è lo strumento con cui Oracle9iAS
(mediante PL/SQL Gateway) soddisfa le richieste
che contengono PL/SQL o chiamate a procedure
residenti sul database (il database deve essere versione 8, 8i o 9i). In Figura 1 sono rappresentati i
passi che si realizzano quando il server riceve una
richiesta da soddisfare con PL/SQL Gateway:
1. Oracle HTTP Server (il web server Apache)
riceve la richiesta di una pagina basata su
PL/SQL;
2. La richiesta viene girata a PL/SQL Gateway;
3. La richiesta viene girata al database utilizzando
per la connessione le informazioni contenute
nel DAD;
4. PL/SQL Gateway determina i parametri da utilizzare e invoca le procedure PL/SQL residenti
sul database;
Un problema nell’utilizzo di MOD_PLSQL è l’architettura multi-processo di Apache. In particolare
se una richiesta viene suddivisa in molte sotto-richieste inviate al server, Apache stabilirà una diversa
connessione col database per ogni sotto-richiesta.
Ciò genera problemi se si intendono utilizzare
variabili pubbliche dei package che restano valorizzate nella sessione e dunque si resettano per ogni
sotto-richiesta.
Per utilizzare PL/SQL Gateway, e quindi
MOD_PLSQL, l’URL da utilizzare nel browser
dovrà avere la seguente forma:
protocollo://host[:porta]/prefisso/DAD/[!]
[schema.][package.]nome_proc[?parametri]
dove
protocollo è http oppure https
host è la macchina dove gira il web server
porta è la porta utilizzata dall’application server
(80 per default)
prefisso è il path virtuale utilizzato per indicare al
web server le richieste da indirizzare alla PL/SQL
Gateway. Prefisso viene dichiarato in fase di confi-
41
CP 112
F O
C
U
S
Open Source
gurazione del web server e vale “pls” per default
DAD è il DAD da utilizzare
! è un carattere che indica al web server di utilizzare lo schema “flessibile” per il passaggio dei
parametri. In questo schema i parametri da passare sono un numero variabile, è utile se l’utente
può decidere liberamente quanti e quali parametri passare mediante un apposito form HTML
Schema è il nome dell’utente Oracle proprietario della procedura da eseguire
Package è il nome del package di cui fa parte la
procedura da eseguire
nome_proc è il nome della procedura da eseguire
?parametri sono i parametri da passare alla procedura, indicati per nome oppure in array in
caso di schema “flessibile”.
«Perl è un linguaggio di programmazione interpretato ottimizzato
per la ricerca in qualunque tipo di file di testo, per l’estrazione di
informazioni da questi file e per stampare report basati sulle informazioni estratte. È anche un buon linguaggio per molte attività di
gestione dei sistemi.
Il linguaggio vuole essere pratico (facile da usare, efficiente, completo) piuttosto che bello (piccolo, elegante, minimo). Combina
(secondo l’autore, in ogni modo) alcune delle migliori funzionalità
dei linguaggi C, sed, awk e sh, quindi le persone che hanno familiarità con questi linguaggi dovrebbero avere poche difficoltà con
perl. (Gli storici dei linguaggi noteranno delle tracce di csh, Pascal
ed anche di BASIC|PLUS.)
La sintassi delle espressioni è molto vicina a quella del C.
Se avete un problema per cui normalmente usereste sed o awk o
sh, ma che eccede le capacità di quei linguaggi oppure deve essere
eseguito ad una velocità leggermente superiore, e non volete scrivere le cose più banali in C, allora perl fa per voi. Ci sono anche dei
traduttori per convertire i vostri script sed o awk in script perl.
OK, l’ho elogiato già abbastanza.»
RIQUADRO 1 Il commento con cui Wall accompagnò il rilascio di Perl sul
newsgroup alt.comp.sources. (18 Dicembre 1987)
Un esempio di URL potrebbe essere
http://www.miosito.it:1800/pls/mioDAD/
ordini.inoltra?ord_id=2453
Nel caso in cui la procedura da chiamare sia
definita più volte nel database con parametri che
hanno lo stesso nome (ed ovviamente sono di tipo
diverso) la chiamata va in errore. In caso di overloading di procedure, dunque, bisogna denominare
i parametri in maniera diversa nelle diverse implementazioni della procedura.
tuttora, vincere la concorrenza dei database open
source. Su quali armi può contare Oracle per sconfiggere la concorrenza? Innanzi tutto la popolarità
del marchio, affidarsi ad un nome noto fa dormire
meglio la notte. Poi la stabilità del prodotto, se c’è
un bug su Oracle i tempi di risoluzione non saranno
brevissimi ma la soluzione sarà presumibilmente affidabile e risolverà contemporaneamente anche altri
problemi. Se c’è un problema su un database open
source qualcuno si occuperà di fare una patch,
magari in tempi brevi, per quello specifico problema,
ma ciò influenzerà negativamente la stabilità del
prodotto. Inoltre c’è il problema dell’education e del
supporto tecnico, trovare manuali, corsi e consulenti Oracle è facile come comprare una fetta di prosciutto, trovare supporto qualificato per postgreSQL
o per MySQL è decisamente più complesso.
Ed i vantaggi di usare altri database? Il costo, il
costo ed … il costo. E pure la possibilità di fruire
liberamente del codice sorgente del prodotto.
I due più diffusi database open source in circolazione sono MySQL e PostgreSQL. MySQL è molto
limitato, gestisce il lock solo a livello di tabella, non
gestisce per niente database trigger, foreign key,
rule, subselect e view. PostgreSQL ha quasi tutte
le funzionalità avanzate dei database commerciali
e, con il rilascio della versione 7.1, ha raggiunto
anche livelli di performance più che soddisfacenti.
PostgreSQL ha delle “estensioni” che facilitano la
migrazione da Oracle.
Anche Oracle ha sviluppato il suo prodotto per
la migrazione da altri database, Oracle migration
workbench.
Tra i prodotti da cui è possibile migrare verso
Oracle è incluso MySQL. In Tabella 1 sono rappresentati, per ogni database, gli oggetti che possono
essere migrati mediante Oracle migration workbench. L’inclusione di MySQL nella lista della “concorrenza riconosciuta” ha inorgoglito non poco gli
appassionati di open source e, soprattutto, quelli
che avevano scelto MySQL come database. Esempi
di grandi aziende oppure enti che hanno scelto
MySQL? Yahoo! e la NASA, mica male!
Qualcuno si sarà chiesto se Oracle ha provato a
sviluppare codice open source. Ebbene sì, ma con
scarsi risultati. Oracle aveva preso in considerazione la possibilità di sviluppare in modalità open
source alcune librerie di algoritmi per la crittografia. Dopo pochi mesi il tentativo è stato abortito. Ci
si è resi conto che non si riusciva a fornire un supporto soddisfacente ai clienti. Questo è tutto per i
database open source, ora parliamo di Perl.
Oracle e Perl
Oracle ed i DB Open Source
42
CP 112
L’integrazione con Linux, Apache e con i linguaggi
di scripting (come vedremo) era un passo necessario
che Oracle doveva compiere per entrare nel mondo
degli “smanettoni”. Il passo successivo era, ed è
Perl (Practical Extraction and Report Language)
è il linguaggio di scripting open source più diffuso.
Perl è nato nel 1987 per opera di Larry Wall.
Lo scopo di Wall era la costruzione di un linguaggio con cui fosse possibile estrarre informazioni da
generici file e creare report delle inforLISTATO 1 Un semplice script Perl che utilizza DBD::Oracle
mazioni estratte. Nel Riquadro 1 è possibile leggere (tradotto in italiano) il
use DBI;
commento che Wall scrisse il 18 Dicembre 1987 per accompagnare il rilascio di
my $id_db = DBI->connect(‘DBI:Oracle:ordini’)
Perl sul newsgroup alt.comp.sources.
or die “Impossibile connettersi al database:“ . DBI->errstr;
my $id_st = $id_db->prepare(‘SELECT stato, note FROM Ordini
Vediamo come ci si connette da Perl
WHERE Ord_id = ?’) or die “Impossibile creare l’istruzione
ad Oracle. In generale per la conda eseguire: “ . $id_db->errstr;
nessione a database, Perl è munito di
print “Numero Ordine> “;
una interfaccia chiamata DBI (Database
while ($Ordid = ) {
Interface). DBI è una interfaccia molto
chomp $Ordid;
semplice con cui è possibile dichiarare
$id_st->execute($Ordid)
or die “Impossibile eseguire l’istruzione: “ . $id_st->errstr;
quali istruzioni si vogliono inviare al
database e leggere i dati su db. DBI non
my ($stato, $note);
conosce il linguaggio dei singoli data$id_st->bind_columns(\$stato, \$note);
base, l’implementazione delle istruzioni
while ($id_st->fetch()) {
viene realizzata mediante appositi driver
print “Ordine $Ordid Stato: $stato ($note)\n”;
diversi per ogni database.
}
Il driver utilizzato per connettersi ad
if ($id_st->rows == 0) {
Oracle si chiama DBD::Oracle. Questo
print “L’ordine $Ordid non esiste.\n”;
tipo di interfaccia garantisce una eccel}
lente portabilità. Se si intende svilup$id_st->finish;
pare con un database MySQL ma il
print “\n”;
database di produzione è Oracle basta,
print “Numero Ordine> “;
}
infatti, sostituire il driver DBD::mysql
con il driver DBD::Oracle.
$id_db->disco
Il codice Perl resta invariato perché
in Perl si utilizza solo DBI. Vediamo un
dichiara la variabile id_db (identificatore del dataesempio. Vogliamo realizzare uno script che, dato il
base) e ci mette dentro il valore di ritorno della funnumero di un ordine, restituisca lo stato dell’ordine
zione connect che si connette al database ordini utilize le eventuali note.
zando il driver per Oracle. La stringa DBI:Oracle
Le informazioni sono contenute nella tabella
è l’unica cosa di questo programma che deve essere
Ordini presente nel database ordini. Il Listato 1 conmodificata per utilizzare un altro database. or die
tiene lo script per intero, analizziamo le singole istruserve a gestire le eccezioni, in caso di errore bisogna
zioni. L’istruzione use DBI; serve a caricare DBI,
abortire il processo visualizzando il messaggio “Imposquale driver utilizzare lo diremo dopo.
sibile connettersi al database” e l’errore che è occorso.
my $id_db = DBI->connect(‘DBI:Oracle:ordini’)
or die “Impossibile connettersi al database:
“ . DBI->errstr;
my $id_st = $id_db->prepare(‘SELECT stato,
note FROM Ordini WHERE Ord_id = ?’)
TABELLA 1 Gli oggetti che possono essere migrati per ogni database, mediante Oracle migration workbench
FEATURE SUPPORT
ACCESS
Tables
Views
Indexes
Groups/Roles
Users
Constraints
Priviliges
User Defined Types
Stored Procedures
Triggers
Embedded SQL
Y
Y(Queries)
Y
N/A
Y
Y (validation rules)
Y
Y
N/A
N/A
N/A
to Pro*C
Relations, Link Tables.
Application code reuse
Other Features
INFORMIX
& SYBASE
Y
Y
Y
Y
Y
Y
Y
N/A
Y
Y
ESQL/C
N/A
SQL SERVER
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
N/A
N/A
MYSQL
Y
N/A
Y
N/A
Y
Y
Y
Y
N/A
N/A
N/A
ENUM support
DB2/400
Y
Y
Y
N
Y
Y
Y
N
N
N
N
N/A
43
CP 112
F O
C
U
S
Open Source
or die “Impossibile creare l’istruzione
da eseguire: “ . $id_db->errstr;
tutte le righe restituite dalla select. Per ogni riga, lo
stato e le note dell’ordine vengono stampati a video
con l’istruzione
print “Ordine $Ordid Stato: $stato $note\n”;
è simile all’istruzione precedente, dichiara id_st
(identificatore dello statement da eseguire), lo prepara (effettua un parsing) e gestisce un eventuale
errore. Il carattere “?” è un jolly a cui sarà sostituito
il valore inserito dall’utente.
print “Numero Ordine> “; è il prompt per
l’utente ed il while che segue non fa altro che ripetere la richiesta fin quando l’utente digita qualcosa.
Chomp elimina il carattere di invio a fine input.
$id_st->execute($Ordid)
or die “Impossibile eseguire l’istruzione: “
. $id_st->errstr;
Questa istruzione esegue lo statement passando
il valore inserito dall’utente e gestisce gli eventuali
errori al solito modo.
my ($stato, $note);
$id_st->bind_columns(\$stato, \$note);
Dopo aver dichiarato due variabili, le colleghiamo
ai valori restituiti dalla select mediante l’istruzione
bind_columns. Il while che segue effettua il fetch di
BIBLIOGRAFIA
[1] A. Duncan, S. Hull – “Oracle & Open Source”,
O’Reilly, 2001
[2] U. Ogbuji – “How to get Oracle up and running
on your Linux box”, LinuxWorld, 1999
[3] B. D. Brown – “The Expert’s Guide to OAS/
9iAS Migration”, Oracle Magazine, V 2001
[4] Oracle – “Oracle 9i Application Server, features”, Oracle.com, 2002
[5] Oracle – “Oracle 9i Application Server, Using
the PL/SQL Gateway”, Oracle.com, 2001
[6] M. Paithane – “Oracle iAS – Technical Overview of Web Server and Modules”, OTN, 2001
[7] R. Cook – “Open source databases”, LinuxWorld, 2000
[8] T. Perdue – “Open Source Databases: As The
Tables Turn”, phpbuider.com, 2000
[9] P. Wayner – “Open source databases bloom”,
Computerworld, 2001
[10] P. S. Trimble – “Open minds on open source”,
Federal Computer Week, 2000
[11] A. Salkever – “Is Open-Source Security Software Safe?”, BusinessWeek, 2001
[12] “Perl Fast Facts”, Perl Mongers, 2002
[13] M. J. Dominus – “Short guide to DBI”, Perl.com,
1999
[14] T. M. Brannon – “DBIx::Recordset VS DBI”,
Perl.com, 2001
[15] Chromatic – “DBI is OK”, Perl.com , 2001
44
CP 112
Per gestire l’eventualità che non ci siano record
per l’ordine richiesto abbiamo inserito il controllo
if ($id_st->rows == 0) {
print “L’ordine $Ordid non esiste.\n”;
}
Abbiamo finito: $id_st->finish; chiude il cursore relativo allo statement id_st e $id_db>disconnect; si disconnette dal database.
Il runtime di questo script è una cosa del genere:
Numero Ordine> 2713
Ordine 2713 Stato: inevaso (manca pagamento)
Numero Ordine>
Ovviamente DBI offre molto di più di quanto
abbiamo visto in questo semplice script ma approfondire l’argomento va oltre lo scopo di quest’articolo, in bibliografia e nei riferimenti si possono trovare informazioni più complete e dettagliate.
Conclusioni
Pur non applicando direttamente la filosofia open
source, Oracle si sta legando fortemente a questo
nuovo modo di intendere il software. Rimasi perplesso nel Maggio del 2000 quando, alla conferenza
iDevelop2000 della Oracle, trovai nel software pack,
contenente tutti i prodotti Oracle, il cd di Linux.
Sapevo che i prodotti Oracle erano ormai disponibili
anche su quella piattaforma, ma distribuire addirittura il cd mi pareva troppo! Oggi Oracle ha addirittura preferito, per la nuova release di Oracle9iAS, il
web server open source Apache a quello prodotto in
casa. La “strana coppia” non è poi tanto “strana”.
RIFERIMENTI
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
http://www.opensource.org
http://www.oracle.com
http://technet.oracle.com
http://www.linuxworld.com
http://www.oramag.com
http://www.computerworld.com/
http://www.fcw.com
http://www.businessweek.com
http://www.mysql.com
http://www.it.postgresql.org
http://www.phpbuilder.com
http://www.perl.org
http://www.perl.com