2012-05-15 16 views
13

Ho un'applicazione che utilizza quattro database in diverse posizioni geografiche. Tutti i database contengono le stesse tabelle e solo il nome del database è diverso in base alla posizione. Devo creare alcuni report nella mia applicazione che utilizza i dati di ogni database. Quale sarebbe il modo corretto di creare una connessione di database da un'applicazione java e c'è un modello di progettazione adatto per questa attività che potrei usare?Come creare più connessioni database per database diversi in java

risposta

7

Come non avete etichettato la tua domanda con tutto questo, hibernate, JPA, ORM, suppongo avete a che fare con JDBC pianura.

Detto questo, suggerisco di avere uno strato DAO per gestire i database sottostanti e lasciare i dettagli della connessione a implementazioni specifiche. È possibile configurare le stringhe di connessione in alcuni file .properties, diciamo.

[Complemento]

È anche possibile fare uso di fabbrica DAO, un'implementazione di Abstract Factory o il motivo Mathod fabbrica, a seconda di quale si adatta qui.

[Link]

+0

ma come si avranno più connessioni db? –

+0

@munna: Ogni implementazione DAO conoscerà la sua origine dati. –

1

Il modo ideale per ottenere questo risultato è utilizzare un sistema multidimensionale come OLAP. Ma vedi se riesci a creare una vista da quei database. Quindi devi solo interrogare la vista (cioè solo una singola connessione al database). Inoltre, puoi comunque utilizzare più connessioni al database, se lo desideri.

1

È possibile gestire facilmente più connessioni utilizzando uno strumento ORM come Hibernate. È possibile specificare ciascuna connessione in un file di configurazione separato e creare un'istanza della connessione richiesta ottenendo ogni volta una nuova factory di sessione.

altro modo sarebbe quello di utilizzare DataSource e JNDI: Java connecting to multiple databases

Penso che si possa utilizzare una combinazione di pattern Factory e pattern Singleton per lo scopo.

3

Ci sono diversi modi per raggiungere questo obiettivo:

  1. Se si utilizza qualsiasi container Java EE che supporta transazione distribuita quindi è possibile utilizzare la funzionalità lì.
  2. Se si utilizza semplicemente JDBC, sarà necessario mantenere la propria connessione per ogni database. per JDBC:
    1. fornire tutti i dettagli di connessione
    2. Avere una facciata che dà oggetto desiderato chiamando il DAO generico astratto.
    3. Avere una factory che crea dao in base alla connessione.
  3. Utilizzare gli strumenti ORM come Hibernate, in cui è possibile utilizzare la configurazione per più database. Tutorial.
  4. Se si utilizza Spring, è possibile configurare un'origine dati per database. Docs

Design Patterns:

  • Facciata Pattern - per nascondere la complessità e l'utilizzo del database multipla.
  • Fabbrica - Nel caso in cui si gestisca da soli la connessione al database.
  • Singleton - Per origini dati
0

è molto facile :)

1.Creare una fonte di dati per provare la connessione a DB

public DataSource getDataSource(String db) throws Exception { 
DataSource dt = null; 
InitialContext ic = null; 
try { 
    if(db.trim().equals("you_database_name")) { 
     dt = (DataSource)ic.lookup("jdbc/connection_name"); 
    } else if(db.trim().equals("you_database_name")) { 
     dt = (DataSource) ic.lookup("jdbc/connection_name"); 
    } 
    return dt; 
} catch(NamingException n) { 
    throw new Exception("Err getDataSource (ServiceLocator) NamingException - " + n.getMessage()); 
} 

2.Creare una classe DataBase, ricorda chiudere tutte le connessione in questo punto.

public class DataBases { 
public YouNameDataSourceClass dataSrc; 
public DataBases() throws Exception { 
    super(); 
    dataSrc = new YouNameDataSourceClass.getDataSource(); 
} 
public Connection getConnectionAS400() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 

public Connection getConnectionOracle() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 

public Connection getConnectionSQLServer() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 
} 

Buona lettura.

Problemi correlati