Scarlet: Jira clustering with Terracotta

Posted by luca
on Friday, November 09

The first public beta release of Scarlet is officially out!

Scarlet is a free, open source, clustering extension to Atlassian Jira, realized with Terracotta DSO by Sergio Bossa for Sourcesense.

Download it here: here and vote it on DZone.

DAO Pattern

Posted by luca
on Wednesday, March 22
Negli ultimi venti anni la gestione delle basi di dati ?� stata sicuramente una delle problematiche pi?? importanti nella progettazione dei software. Una moltitudine di sorgenti di dati ?� oggi a nostra disposizione, soluzioni che garantiscono flessibilit?� e che hanno mostrano i propri punti di forza, a seconda dell'ambiente in cui girano. Spesso ci si trova quindi a dover cambiare rapidamente DBMS a causa delle continue evoluzioni del mercato, o per modificare in corso d'opera gli scopi di un'applicazione. In termini progettuali, questo si traduce in una capacit?� ad adattare il proprio codice, senza dover riscrivere interi strati. In questo contesto si inserisce il Data Access Object pattern (DAO), il principio alla base ?� quello di incapsulare l'accesso ai dati, in modo da dover cambiare solo quelle implementazioni di metodi che effettivamente recuperano le informazioni.

Struttura

La figura 1 mostra il diagramma delle classi del DAO Pattern. Diagramma DAO Pattern
Figura 1 Data Access Object
BusinessObject: E' l'oggetto del business tier che richiede i dati, pu?? essere implementato come entity bean, session bean, etc.. DataAccessObject: E' l'oggetto principale per questo pattern, ha il ruolo di astrarre l'accesso fisico ai dati e di rendere trasparente il loro accesso. DataSource: Rappresenta l'implementazione della sorgente dei dati, che pu?? essere un RDBMS, un OODBMS, un file XML o addirittura un altro processo business. TransferObject: Rappresenta il transfer object che viene utilizzato come semplice contenitore di dati. Pu?? essere utilizzato ad esempio per ritornare dati al client.

Impiego

E' possibile stabilire delle relazioni fra questi oggetti, in modo che il programma a runtime scelga quali classi utilizzare al momento dell'accesso ai dati. Possono essere impiegate due strategie: Factory Method: Quando si ?� certi che l'implementazione sottostante non sortir?� variazioni questa strategia ?� ottimale, in quanto vengono creati semplicemente i DAO corrispondenti agli oggetti business. Abstract Method: Quando la fonte dei dati ha un'alta rotazione, e quindi anche le implementazioni, ?� possibile utilizzare questa strategia per generare a runtime le factory per il datasource che utilizziamo in quel momento. Ad esempio possiamo ottenere la factory per l'implementazione MySql, e quindi creare i DAO necessari per eseguire query relazionali. L'idea di base ?� quella di avere una superclasse astratta e delle sottoclassi che rappresentato le DAO factory per le varie implementazioni, queste ultime genereranno i DAO veri e propri, uno per ogni business object.

Esempio

Presentiamo un semplice esempio per la gestione di due soli business object: Utente e Gruppo. Il fulcro di questo pattern ?� ovviamente DAOFactory, ?� una classe astratta che a sua volta genera la factory richiesta, a seconda della fonte dei dati (Abstract Method). Nota: per ragioni di sintesi nell'esempio ?� contemplato solo il recupero dei dati.
package net.tdc.dao.base;

import net.tdc.dao.StorageType;
import net.tdc.dao.mysql.MySqlDAOFactory;
import net.tdc.dao.oracle.OracleDAOFactory;

public abstract class DAOFactory {

  public static int DEFAULT_STORAGE_TYPE = StorageType.MYSQL;

  public static DAOFactory getDAOFactory(int factory){
    switch(factory){
      case StorageType.MYSQL:
        return new MySqlDAOFactory();
      case StorageType.ORACLE:
        return new OracleDAOFactory();
      default:
        return null;
    }
  }

  public static DAOFactory getDefaultDAOFactory(){
    return DAOFactory.getDAOFactory(DEFAULT_STORAGE_TYPE);
  }

  public abstract UtenteDAO getUtenteDAO();
  public abstract GruppoDAO getGruppoDAO();

}
Direi che il codice si commenta da solo, abbiamo getDAOFactory che ?� il metodo pi?? importante, poi abbiamo dei metodi astratti (uno per ogni DAO) che vengono implementati in ogni singola factory. Quindi per utilizzare un business object scriveremo:
UtenteDAO utente = DAOFactory.getDefaultDAOFactory().getUtenteDAO();
Quello che salta subito all'occhio ?� la trasparenza con cui l'applicazione gestisce gli accessi, basta solo modificare una riga per cambiare DBMS.

Allegati

Bibliografia

Immagini

  • Figura 1 �� 2001-2002 Sun Microsystems, Inc.