Showing posts with label Oracle XE(Italiano). Show all posts
Showing posts with label Oracle XE(Italiano). Show all posts

MySQL VS Oracle XE

Oracle XE vs MySQL
G.Morreale

Introduzione:

Dopo aver installato e provato(vedi precedenti articoli) la versione Express di Oracle è arrivato il momento di vedere se le prestazioni sono migliori o meno rispetto al noto dbms MySQL.

Scenario

Allora recupero la mia solita applicazione Java EE di test, costituita da un modulo EJB e un modulo WEB.
Il modulo EJB dotato di un session bean e un entity bean.

L'entity bean mappa la tabella esempiotable costituita da due colonne (id (INTEGER AUTOINC.), testo(STRING)).
Il persistence provider utilizzato è hibernate.
L'entitymanager utilizzato è un JTA Entity Manager ottenuto tramite dependency injection.
Il modulo Web è dotato di una servlet che ha il compito di richiamare il session bean presente nel modulo EJB.

Il test è una comparazione delle performance sia per quanto riguarda le operazioni di inserimento sul db che per ciò che concerne l'estrazione dei dati(SELECT).

Quindi il session bean(e relativa interfaccia locale) è dotato di due metodi:

  • Uno per l'inserimento di 'n' entityBean

    public void batchInsert(int nRows)
    {
        for (int i = 0; i < nRows; i++)
        {
            em.persist(new Esempiotable());            
        }
    }

  • l'altro per l'estrazione di tutti gli entityBean corrispondenti a tutte le righe della tabella di test

    public void listAll()
    {                
        List<Esempiotable> list = em.createNamedQuery("Esempiotable.ALL").getResultList();
        for (Esempiotable t: list)
        { System.out.println(t.getId());}        
    }


L'ambiente di sviluppo utilizzato è netbeans 6.1 dal quale sfrutterò il profiler per raccogliere i risultati ottenuti.
L'application server utilizzato è Glassfish V2.

Driver JDBC Mysql: mysql-connector-java-5.1.6-bin.jar
Driver JDBC Oracle:ojdbc14.jar

In Mysql storage engine utilizzato: "Inno DB"

L'Entity Bean

L'entity bean come già accennato è il mapping di una semplice tabella dotata di una colonna integer autoincrement e una colonna di testo.
Per cui il codice (valido per il mapping nei confronti di mysql) è:


@Entity
@Table(name = "esempiotable")
@NamedQueries(
{
   @NamedQuery(name = "Esempiotable.ALL", query = "SELECT e FROM Esempiotable e")
})
public class Esempiotable implements Serializable {
    private static final long serialVersionUID = 1L;
        
    @Id   
    @GeneratedValue(strategy=GenerationType.IDENTITY)    
    @Column(name = "id", nullable = false)
    private Integer id;
    
    @Column(name = "testo", nullable = true)
    private String testo;
//...omessi metodi accessor e costruttore


Tale mapping funziona correttamente su MySQL, ma utilizzandolo con Oracle si ottiene il seguente errore:

...
Caused by: java.lang.IllegalArgumentException: Dialect does not support identity key generation
        at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:223)
        at com.sun.enterprise.util.EntityManagerWrapper.persist(EntityManagerWrapper.java:440)
...

Ciò è dovuto al fatto che l'autoincrement di Oracle è gestito attraverso le sequenze, ovvero oggetti del db che indicano l'algoritmo di generazione e incremento della chiave primaria.
Quindi  "GenerationType.IDENTITY" deve essere sostituito con "GenerationType.SEQUENCE"

Tale modifica non è sufficente infatti si ottiene il seguente errore:

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not get next sequence value

L'errore si verifica perchè hibernate non è stato istruito circa quale sequence utilizzare.
Quindi attraverso SQLDeveloper andiamo a leggere il nome del sequence generator e indichiamolo attraverso le opportune annotation:

In definitiva il codice

@GeneratedValue(strategy=GenerationType.IDENTITY)  

Verrà sostituito con il seguente nel momento in cui il test dovrà essere eseguito su dbms oracle xe.

@GeneratedValue(strategy=GenerationType.AUTO, generator="ESEMPIOTABLE_ID_SEQ")
@SequenceGenerator(name="ESEMPIOTABLE_ID_SEQ", sequenceName="ESEMPIOTABLE_ID_SEQ")    

nota: E' stato utilizzato il metodo AUTO piuttosto che SEQUENCE per maggiore portabilità rispetto a futuri cambiamenti.


Gli Inserimenti

(Per la lettura dei risultati leggere il selftime dei metodi batchInsert o listAll)

Il primo test prevede un inserimento di 100.000 entity all'interno del db:
Vediamo subito i risultati:

Oracle XE


MySQL
Ripetiamo il test con 500.000

Oracle XE

MySQL

L'estrazione
Analizziamo i risultati di estrazione di 500.000 elementi:
Oracle XE
MySQL

Conclusione

Questi test sono da prendere con le pinze in quanto l'architettura del sistema dbms, application server, sistema operativo e quant'altro non è quella relativa a un sistema in "produzione".

Il setup e il tuning dei due dbms è quello standard, ovvero non è stata apportata alcuna modifica dopo l'installazione alla configurazione dei relativi dbms.

Inoltre i test sono relativi solo a 2 case e non prevedendo altri scenari tipici di un applicazione.

Fatte queste premesse, possiamo dire che mysql sia in fase di inserimento che in fase di estrazione ha dato dei risultati nettamente migliori.

Personalmente questi risultati nonostante siano basati su delle prove concrete mi lasciano un pò perplesso, in quanto mi aspetto di più lato Oracle. Se qualcuno che conosce bene Oracle XE può darci qualche consiglio per rifare i test in virtù di alcuni settaggi o accorgimenti ben venga.


Oracle XE: Importare DB da MySQL

Oracle XE - Come effettuare la migrazione da MySQL
G.Morreale

Introduzione:

Nel precedente articolo ho cercato di introdurre l'uso di SqlDeveloper utilizzando una connessione verso Oracle XE.
Adesso vediamo quali sono i vari passi da seguire per importare uno o più database dal mysql a oracle xe utilizzando oracle SqlDeveloper.


Configurazione Supporto MySQL

Selezionare: Tools -> Preferences -> Database -> Thirdy Party JDBC Driver -> Add Entry ..


Scegliere sul disco il file .jar che contiene il connettore jdbc di mysql (Connector J - scaricabile da http://dev.mysql.com/downloads/connector/j/5.0.html )
Salvare i settaggi.


Creazione connessione MySQL

Adesso tornando sul pannello principale Selezionare:
Connections -> New Connections -> Mysql Tab(prima non c'èra!!) -> inserire i parametri della connessione al db mysql.
salviamo la connesione come MySQL.


nota:
durante il processo di migrazione sqldeveloper, nonostante la connessione mysql specifichi un determinato database, importa tutti i db su cui l'utente usato nella connessione ha i relativi permessi.
Quindi al fine di importare un singolo db conviene creare in mysql un utente ad hoc per il database da importare.

Una volta creata la connesione mysql e dopo essersi connessi è possibile navigare ed utilizzare sqldeveloper come client mysql(un alternativa al mysql querybrowser)


Creazione nuova connessione ORACLE per la migrazione

Prima di effettuare la migrazione, è consigliabile(non obbligatorio) creare un utente(ad. es. MY_TEST) oracle diverso da system, su cui importeremo il db mysql.

Per far ciò selezionare other user -> create user e assegnare tutti i permessi possibili (Grant all, admin all, default all) (è un test!!)

Adesso creiamo una nuova connessione oracle sull'utente appena creato e la salviamo con il nome ORACLE MY TEST.

Riepilogando avremo quindi 3 connessioni

  1. MYSQL - Connessione verso il db (o i DB) da importare
  2. ORACLE SYSTEM - Connessione con l'utente system che non useremo ai fini della migrazione
  3. ORACLE MY TEST - Connessione con l'utete MY_TEST sul quale effettueremo l'importazione.

La Migrazione

Adesso per effettuare la migrazione bisogna selezionare:

Migration -> QuickMigrate -> Scegliere la connessione mysql(sorgente) -> Scegliere la connesione oracle(destinazione) -> Effettuare il Verify -> Scegliere se migrare solo tabelle o tabelle/dati -> Finish!!


All'intero dell'utente oracle relativo alla destinazione indicata in fase di migrazione ci saranno gli elementi (tabelle, viste etc.) importati direttamente da mysql.

Conclusione

Il processo di migrazione risulta essere abbastanza semplice e lineare, almeno per ciò che riguarda database "semplici".
Nel prossimo articolo invece ho intenzione di scrivere circa un confronto di prestazioni tra mysql ed oracle xe utilizzandoli con hibernate su inserimenti e select relativi a migliaglia di righe.


Oracle XE - Uno sguardo verso un dbms Oracle free

Oracle XE - Primi passi
G.Morreale

Introduzione:

Oracle XE è la versione free del re dei DBMS.
Con il seguente articolo diamo un occhio ai primi passi da muovere dopo l'installazione del pacchetto Oracle XE.

Limitazioni di Oracle XE

Prima di andare avanti vorrei però far presente che tale prodotto non è opensource come mysql o altri dbms e nella versione sono presenti le seguenti limitazioni:

MASSIMO 1 GB DI MEMORIA RAM USATA
MASSIMO 1 CPU
MASSIMO 4 gb di dati

Quindi anche se la macchina è dotata di 4 processori e 16 GB di Ram Oracle Xe utilizzerà solo una parte delle risorse secondo i limiti appena elencati.

Sql Developer

L'installazione di Oracle XE prevede un http listener in grado di rispondere sulla porta 8080.
L'applicazione installata permette di effettuare gran parte delle operazioni del dbms, è semplice e intutitiva.
Per darci un occhio provare a richiamare dal browser il seguente url: http://127.0.0.1:8080/apex/

Nonostante ciò ho preferito installare ed usare un tool gratuito fornito da Oracle che consente una gestione più completa del dbms oracle e non solo.

La Versione analizzata è la 1.5.1

La prima connessione

Non appena installato e avviato Sql Developer, bisogna aggiungere una nuova connessione per poter operare sul dbms.
Con il tasto destro del mouse è possibile aprire il menu a tendina in corrispondenza dell'icona "Connections" e scegliere "New Connection".

La form è già predisposta, basta indicare il nome della connessione, l'utente system e la password scelta in fase di installazione.
Si salva la connessione, si effettua un test di connettività, e se tutto è ok si procede con la connessione vera e propria.

Consiglio di salvare questa connessione come ORACLE SYSTEM, in modo da distinguerla con altre che creeremo successivamente.

Oggetti del DBMS

Una volta connessi compaiono una serie di oggetti, di seguito elenco e descrivo brevemente le funzionalità di tali elementi:




  • Tables - Le tabelle!
  • Views  - Tabelle virtuali
  • Indexes - Indici presenti nelle colonne delle varie tabelle
  • Packages - Possono contenere functions e/o procedures, è un elemento che serve a raggruparli.
  • Procedures - Procedure PL/SQL (Linguaggio di programmazione per dbms ORACLE)
  • Functions - Funzione in PL/SQL a differenza della precedente ritorna un valore
  • Queues - Code usate dalla tecnologia oracle AQ (Oracle Streams Advanced Queueing)
  • Queues Tables - Tabelle che contentongo i dati utilizzati dalle code.
  • Triggers - Blocchi di codice PL/SQL spesso associati a tabelle o schema. (implementabili in PL/SQL o Java), vengono eseguiti al verificarsi di determinate condizioni.
  • Types - Tipi di dato definiti dall'utente, da utilizzare ad esempio nella definizione di colonne.
  • Sequences - Algoritmi per la generazione automatica di primary key. (un esempio banale è l'autoincrement)
  • Materialized Views - Contiene i risultati di una view.
  • Materialized Views Logs - log dei cambiamenti sulle Materialized Views
  • Synonyms(Public) - Contiene una serie di alias, per chiamare in modo diverso i vari oggetti del db (tabelle, view, sequences etc. etc.)
  • Database Links(Public) - Contiene link verso database NON oracle, per consentire l'accesso mediante dbms oracle a database, quindi tabelle, viste etc NON oracle.
  • Directories - Contiene gli alias per directory del filesystem nel quale si trovano i LOB(dati in formato binario) o i dati esterni alle tabelle.
  • Java - Raccoglie eventuali sorgenti java
  • XML Schemas - Contiene gli schemi xml che definisco la struttura dei documenti xml presenti nel dbms
  • Recycle bin - Permette di recuperare oggetti del db sottoposti a comando drop
  • Other Users -  Contiene gli utenti definiti nel dbms

Riguardo al pannello presente nell'immagine di sopra, tutti gli elementi da "tables" fino a "other users" sono relativi all'utente con il quale si è effettuata la connessione.

Cliccando invece sul nodo "other users" e aprendo il nodo di uno degli utenti presenti verranno visualizzati tutti gli oggetti (tables,views, indexes, etc.) relativi a quel particolare utente.

Creare uno schema

In Oracle XE, non è possible creare più di un db per installazione(1 db <-> 1 computer), però esiste il concetto di schema con il quale la limitazione diventa in alcuni casi inesistente.

Lo schema è una collezione di oggetti del database (tabelle, view, procedure etc.)
Ogni schema è di proprietà di almeno un utente che ha lo stesso nome dello schema.

Se ad esempio siamo loggati con l'utente system, la cartella tables(ma anche gli altri oggetti) è relativa allo schema di system.

Quindi se volessimo creare uno schema diverso, dobbiamo creare un nuovo utente per il nuovo schema da creare e poi agire su di esso.


Conclusione

Oracle XE sembra essere una valida alternativa ai dbms free usati a livello desktop.
Ovviamente bisogna usare il prodotto in modo molto più approfondito per capire dove sono realmente i limiti di questo dbms rispetto alle versioni non free e rispetto ai dbms free come mysql o postgresql.
Nel successivo post descriverò il processo per importare i db mysql all'interno di oracle xe