5 Hibernate3 Configurazione
Transcript
Hibernate Configurazione di base Dott. Doria Mauro [email protected] [email protected] I file di configurazione 2 Hibernate prevede l’uso dei file di configurazione formato XML. I principali file sono: – Un file di configurazione unico generale (nome di default: hibernate.cfg.xml) – Un file di mapping per ogni classe persistente (nome di default: nomeclasse.hbm.xml) Il file di configurazione generale può anche essere sostituito da un file properties dal nome “hibernate.propoeries” [email protected] Configurazione di base Il modo migliore per iniziare a lavorare con Hibernate è ottenere un oggetto SessionFactory a partire da un oggetto Configuration. L’istruzione tipica è la seguente: SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 3 Quanto il costruttore della classe Configuration è invocato, Hibernate cercherà un file “hibernate.properties” nella radice del classpath (fuori da tutti i package) e caricherà tutti le proprietà “hibernate.*” dichiarate all’interno del file Quando viene invocato il metodo configure(), Hibernate cercherà il file “hibernate.cfg.xml” nella radice del classpath. [email protected] Configurazione di base Nel caso si vogliano collocare il file di configurazione posizione e/o assegnarli un altro nome, è possibile scrivere: in un’altra SessionFactory sessionFactory = new Configuration() .configure("/persistence/auction.cfg.xml").buildSessionFactory(); Infine, è possibile inserire i dati di configurazione in maniera programmatica come nel seguente esempio: Nuova proprietà. Per le proprietà vi sono specifiche costanti SessionFactory sessionFactory = new Configuration() .configure("/persistence/auction.cfg.xml") .setProperty(Environment.DEFAULT_SCHEMA, "CAVEATEMPTOR") .addResource("auction/CreditCard.hbm.xml") .buildSessionFactory(); 4 NOTA : Le priorità sono: properties xml programmatica Le informazioni non si sostituiscono ma si aggiungono [email protected] SessionFactory 5 Se l’applicazione lavora con più DB, è necessario costruire un oggetto SessionFactory per ogni DB. Una applicazione, solitamente, istanzia SessionFactory all’inizio dell’applicazione. Tutti gli oggetti Session utilizzati durante l’applicazione sono costruiti da questa unica istanza SessionFactory. Un oggetto SessionFactory, una volta costruito, è thread-safe e va condiviso con il resto dell’applicazione. Come fare? La migliore soluzione è costruire un oggetto SessionFactory statico ed una inizializzazione statica. un oggetto [email protected] HibernateUtil 6 Nel caso si utilizzi il prodotto in un ambiene stand-alone, Hibernate ci suggerisce di costruire una classe di utilità per la gestione della SessionFactory. Tale classe prende il nome di HibernateUtil. La classe gestisce, di base, la creazione di oggetti SessionFactory e, in una versione estesa, di oggetti Session legandoli al ThreadLocal E possibile reperire il codice sorgente della classe HibernateUtil direttamente dal sito di Hibernate o su internet (nelle diverse varianti) in quanto è un pattern molto noto nell’ambiente. [email protected] La classe HibernateUtil: 7 package persistence; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateUtil { private static SessionFactory sessionFactory; static { try { sessionFactory=new Configuration() .configure() .buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); } } [email protected] Il file xml di configurazione 8 Il file di configurazione generale si presenta in questa forma: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!– Configura connessione e dialetto --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/helloWorld</property> <property name="hibernate.connection.username“>root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!– Stampa SQL sulla console--> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="use_sql_comments">true</property> <!-- Lista dei file xml di mapping--> <mapping resource="hello/Message.hbm.xml"/> </session-factory> </hibernate-configuration> [email protected] Il file xml di configurazione Base della configurazione sono le informazioni relative al DB: <!– Configura connessione e dialetto --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/helloWorld</property> <property name="hibernate.connection.username“>root</property> <property name="hibernate.connection.password“>root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> Configurazione del data source dialetto NOTA: il prefisso “hibernate” nei nomi delle proprietà si può omettere 9 NOTA: Punto fondamentale della configurazione è la scelta del dialetto. Il dialetto è la variante di SQL specifica per un certo DBMS. Hibernate utilizzerà il dialetto per comporre istruzioni SQL specifiche per un certo DBMS e ne ottimizza l’uso. La maggior parte dei dialetti è disponibile direttamente nelle librerie di Hibernate. [email protected] Il file xml di configurazione Punto fondamentale del file di configurazione è l’indicazione dei file di mappings. Attraverso queste indicazioni, Hibernate sarà in grado di mappare correttamente le classi persistenti dell’applicazione con il database. …. <!-- Lista dei file xml di mapping--> <mapping resource="hello/Message.hbm.xml"/> 10 …. [email protected] Il file xml di configurazione Interessante opzione è la richiesta di visualizzazione delle istruzioni SQL che Hibernate creerà durante il suo utilizzo. ... <property name="show_sql">${displaysql}</property> <property name="format_sql">true</property> <property name="use_sql_comments">true</property> ... 11 In particolare otterremo a video le istruzioni(parametro show_sql) ben formattate (parametro format_sql) e commentate (parametro use_sql_coments). NOTA: Nel precedente esempio si fa utilizzo di una configurazione dinamica. Il parametro verrà passato in fase di start dell’applicazione (lanciando java -displaysql=true). [email protected] Connection pool 12 Per applicazioni non banali è utile utilizzare un pool di connessioni. Lo scopo di una connection pool sono: – Minimizzare l’apertura e la chiusura di nuove connessioni. Il pool mantiene e gestisce le connessioni minimizzando i costi queste due operazioni. Alcuni DBMS possono fare operazioni molto complesse in queste fasi. – Minimizzare le connessioni sospese, Il pool ottimizza l’uso delle connessioni sospese. – Gestire le istruzioni preparate (prepared statement) mantenendole in cache oltre le singole richieste: la costruzione delle istruzioni preparate è costosa per i driver. [email protected] Connection pool senza Hibernate Utilizzo di un pool di connessioni diretto con JDBC (in un ambiente JSE) L’applicazione può utilizzare un algoritmo di pooling di terze parti come il software opn source C3P0 Il codice dell’applicazione chiede un oggetto connection al pool, lo utilizza per lanciare operazioni SQL con JDBC e poi lo rilascia. 13 [email protected] Connection pool con Hibernate 14 Utilizzo di un pool di connessioni con Hibernate (in un ambiente JSE) In questo caso, Hibernate fa da client verso il pool di connessioni. L’applicazioni utilizza oggetti Session e Query per compiere operazioni di persistenza e oggetti Transaction per gestire le transazioni. NOTA: la connection pool C3P0 sono integrati nel framework. E’ necessario aggiungere la libreria c3p0.jar nel progetto. [email protected] Configurare la pool connection E’ possibile configurare il pool di connessioni nel file di configurazione : <!-- Usa il connection pool provider C3P0 --> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> oppure nel file properties: hibernate.c3p0.min_size = 5 hibernate.c3p0.max_size = 20 hibernate.c3p0.timeout = 300 hibernate.c3p0.max_statements = 50 hibernate.c3p0.idle_test_period = 3000 NOTA: la soluzione standard senza C3P0 è: 15 <property name="connection.pool_size">1</property> [email protected] Configurare la pool connection Significato delle proprietà: <!-- Usa il connection pool provider C3P0 --> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> – – – – 16 – min_size: il minimo numero di connessioni che il pool c3p0 mantiene pronte nel pool max_size (obbligatoria): numero di connessioni massimo nel pool timeout: tempo massimo (in secondi) di inattività di un oggetto. Scaduto il tempo l’oggetto viene distrutto. max_statements: numero massimo di istruzioni preparate mantenute in cache Idle_test_period: tempo (in secondi) oltre il quale l’oggetto viene validato [email protected] Per saperne di più Per sapere di più sulla soluzione c3p0 è possibile consultare la documentazione: http://www.mchange.com/projects/c3p0/index.html 17 [email protected] Logging 18 Abbiamo già visto come sia possibile ottenere a video le istruzione SQL che Hibernate crea a fronte delle operazioni di persistenza. Questa è una interessante opzione in quanto ci si può rendere conto di quali istruzioni SQL vengono eseguite ma anche quando. Hibernate, allo scopo di ottimizzazione, esegue in maniera asincrona le istruzioni SQL, in una quantità ed ordine diverso da quello che ci si possa aspettare in virtù delle sue caratteristiche avanzate. Per un logging approfondito potrebbe non essere sufficiente mostrare semplicemente le istruzioni SQL. [email protected] Logging 19 Hibernate fa uso di log4j per il logging. E’ necessario quindi avere la libreria commons-loggings.jar nel progetto. E’ possibile inoltre configurare il logging con log4j creando il file di properties log4j.properties. Di seguito un esempio: # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # Root logger option log4j.rootLogger=INFO, stdout # Hibernate logging options (INFO only shows startup messages) log4j.logger.org.hibernate=INFO # Log JDBC bind parameter runtime arguments log4j.logger.org.hibernate.type=INFO [email protected] Statistiche E’ possibile abilitare e visualizzare le statistiche in maniera programmatica agendo sulla SessionFactory. Di seguito un esempio: Statistics stats = sessionFactory.getStatistics(); stats.setStatisticsEnabled(true); //esempio di metodi per le statistiche stats.getSessionOpenCount(); stats.logSummary(); Interfaccia per le statistiche globali Interfaccia per le statistiche di una singola classe EntityStatistics itemStats = stats.getEntityStatistics("beans.Category"); itemStats.getFetchCount(); Le altre interfacce utili per le statistiche sono: – – 20 – CollectionStatistics QueryStatistics SecondLevelCacheStatistics NOTA: è possibile abilitare le statistiche anche nel file di configurazione: hibernate.generate_statistics=true [email protected] Domande? Statistiche Logging properties xml SessionFactory C3P0 Hello world dialetto 21 Connection Pool
Documenti analoghi
3 Hibernate3 Introduzione a Hibernate
contributo, tra cui molti vendo EJB e gli sviluppatori di Hibernate.
Guida Introduttiva ad Hibernate
Il secondo file, come detto, rappresenta il mapping tra Entità ed Oggetti e verrà trattato ed affrontato
gradualmente durante gli esempi.
Il terzo file serve a configurare Hibernate e sarà lo stess...
Programmazione Java Avanzata
1) Identificare i POJO che hanno una
rappresentazione su database
2) Identificare le proprietà di questi POJO che
devono essere rese persistenti
3) Aggiungere le Java Annotations a ciascun
POJO, pe...
(hibernate).
database
diverse implementazione possono permettere (e rendere
uniforme) l'accesso a DB di diversi vendor
anche se si fa uso di un solo database, tale separazione
migliora comunque la divisione...