Stracciafabrizio’s Weblog

Just another WordPress.com weblog

ultimo passo: comunicazione con il database Spring Hibernate mySQL

with one comment

Articolo precedente mashup Gwt Spring Hibernate

Nel sezione precedente si sono eseguiti tutti i passi necessari per la preparazione dell’IDE di sviluppo Eclipse. L’ultima parte riguarda invece la scelta del DataBase relazionale da utilizzare e le configurazioni necessarie per l’utilizzo. Uno dei vantaggi nell’uso degli strumenti presentati sin d’ora, è quello di poter variare la base dati a cui si fa riferimento con delle semplici modifiche.
Nel nostro caso utilizzeremo mySQL come DB. Grazie all’utilizzo di Hibernate come livello intermedio tra l’applicazione creata e il DB, non saranno presenti problemi di compatibilità poichè Hibernate stesso si occuperà di tradurre il linguaggio sql scritto nel corrispondente dialetto della base di dati sottostante.

Comunicazione con un database sul web

Nelle più classiche applicazioni client-server, scritte in modo accurato, la connessione con il database non dovrebbe quasi mai generare problemi. Nel caso di applicazioni che viaggiano attraverso il web, gestire la chiusura di una connessione è una operazione molto più complessa. A differenza delle applicazioni classiche, infatti, la chiusura della connessione viene lasciata all’utente che, al termine della sua sessione di lavoro, dovrebbe esplicitamente effettuare un’operazione di logout dal database.
Esistono una serie di rischi collegati a questa metodologia di lavoro. Il rischio di timeouts, dovuti ad attese prolungate, che possono anche derivare da momenti di lentezza della rete o da una più bassa velocità di trasferimento, possono rivelarsi pericolosi, poichè non permetterebbero la corretta gestione delle risorse aperte.

La possibilità che un elevatissimo numero di utenti possano accedere alla stessa applicazione web in contemporanea può comunque rivelarsi problematico, soprattutto se il database ha un numero limitato di connessioni contemporanee possibili. Per risolvere e gestire questi problemi si fa ricorso ad un Connection Pool.

Connection pool

Il “Connection Pool” è come se fosse un oggetto che gestisce un insieme di connessioni, la cui logica di funzionamento è piuttosto semplice.

Quando viene istanziato, questo gestore si occupa di aprire una serie di connessioni verso il database. Ogni qualvolta altri oggetti necessitano di accedere al database, richiedono la connessione al gestore che ne fornisce una libera. Quando l’operazione sarà terminata l’oggetto restituirà la connessione al gestore che potrà quindi metterla a disposizione di altri oggetti che la richiederanno. In questo modo non vi sarà alcun degrado nelle prestazioni, in quanto le connessioni non saranno ricreate ogni volta, ma solamente in fase di attivazione dell’applicazione, così come non vi saranno rischi di connessioni inattive bloccate per lungo tempo, in quanto, una volta completata l’operazione, questa viene rilasciata ritornando nuovamente a disposizione.
Hibernate mette a disposizione la possibilità di utilizzare c3p0 come connection pool per la gestione delle connessioni. Più avanti verrà presentato il file necessario per la configurazione.

Integrazione MySQL

Per l’inserimento delle librerie necessarie utilizzeremo ancora una volta Maven.
Nel file pom.xml, sotto la voce dependencies, cliccando sul tasto add è possibile effettuare una ricerca diretta nel repository centrale.
La libreria da ricercare,necessaria alla comunicazione è la seguente:

  • mysql-connector-java

Ad ogni DB corrisponde una specifica libreria, ad esempio se il database utilizzato fosse stato Hipersonic:

  • org.hsqldb
    • Cliccare su salva e attendere il completamento del download.
    • Il successivo passo sarà quello di impostare i parametri di connessione e comunicazione al database nel file persistence.xml di Hibernate.  Solitamente le configurazione per la connessione vengono inserite in un file Hibernate.config ma in questo caso, utilizzando le JPA tutti i parametri vengono inseriti nel file sopra indicato. Il file deve essere inserito nella cartella META-INF accessibile all’applicazione durante l’esecuzione. Situata nel path /src/main/resources/META-INF, questa directory non viene creata durante l’inizializzazione del progetto è quindi necessario crearla.
    • Dopo le prime righe di intestazione si definiscono i primi parametri di creazione per il livello delle persistenze:
    • name
    • (Attributo) Nome dell’entity manager. Questo parametro viene utilizzato alla creazione dell’EntityManagerFactory al boot di Spring.
    • transaction-type
    • (Attributo) tipo di transazione utilizzato. O JTA o RESOURCE_LOCAL (di default viene utilizzato  JTA in un ambiente JavaEE e RESOURCE_LOCAL in un ambiente JavaSE). Quando viene utilizzato un JTA- datasource, di default viene settato JTA, altrimenti viene utilizzato per default il paramentro  RESOURCE_LOCAL.
    • provider
    • Va specificato il nome completo della classe che implementa il provider ejb. org.hibernate.ejb.HibernatePersistence è il provider di Hibernate che implementa le EJB3
      <persistence xmlns=”http://java.sun.com/xml/ns/persistence”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”&nbsp;

      xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd&#8221;

      version=”2.0″>

      <persistence-unit name=”MyPersistenceUnit” transaction-type=”RESOURCE_LOCAL”>

      <provider>org.hibernate.ejb.HibernatePersistence</provider>

      Nella parte <properties> vengono definite  tutte le proprietà riguardanti  la tipologia del DB, il dialetto utilizzato, l’indirizzo del server DB, e lo username e password per la connessione.

      <properties><property name=”hibernate.hbm2ddl.auto” value=”update” /> 

      <property name=”hibernate.show_sql” value=”false” />

      <property name=”hibernate.dialect” value=”org.hibernate.dialect.MySQLDialect” />

      <property name=”hibernate.connection.driver_class” value=”com.mysql.jdbc.Driver” />

      <property name=”hibernate.connection.url” value=”jdbc:mysql://localhost/commenti” />

      <property name=”hibernate.connection.username” value=”root” />

      <property name=”hibernate.connection.password” value=”” />

      inoltre viene definito il connection pool necessario all’applicazione per la comunicazione, in questo caso viene utilizzato il c3p0 e le sue voci principali settate di default sono::

      min_Size e max_Size

      dimensione minima e massime del pool di connessioni a seguito di aperture e chiusure successive.

      timeout

      tempo massimo prima che una connessione sia considerata scaduta e sia chiusa.

      max_statements

      abilita e disabilita la cache dei PreparedStatements

      <property name=”hibernate.c3p0.min_size” value=”5″ /><property name=”hibernate.c3p0.max_size” value=”20″ /> 

      <property name=”hibernate.c3p0.timeout” value=”300″ />

      <property name=”hibernate.c3p0.max_statements” value=”50″ />

      <property name=”hibernate.c3p0.idle_test_period” value=”3000″ />
      </properties>

      <persistence-unit>

      </persistence>

      Al termine delle configurazioni sopra indicate, la creazione di ogni servizio seguirà la seguente struttura di interfacce.

      SCHEMA COMPLETO

      RIFERIMENTI:

      http://community.jboss.org/wiki/HowToconfiguretheC3P0connectionpool
      http://www.mchange.com/projects/c3p0/index.html#appendix_d

Written by stracciafabrizio

March 25, 2011 at 10:59 pm

Posted in GWT, Java, Web

Tagged with , , ,

One Response

Subscribe to comments with RSS.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: