5 Hibernate3 Configurazione

Transcript

5 Hibernate3 Configurazione
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

3 Hibernate3 Introduzione a Hibernate contributo, tra cui molti vendo EJB e gli sviluppatori di Hibernate.

Dettagli

Guida Introduttiva ad 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...

Dettagli

Programmazione Java Avanzata

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...

Dettagli

(hibernate).

(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...

Dettagli