2012-05-15 26 views
13

Tengo una aplicación que usa cuatro bases de datos en diferentes ubicaciones geográficas. Todas las bases de datos contienen las mismas tablas y solo el nombre de la base de datos es diferente según la ubicación. Tengo que crear algunos informes en mi aplicación que utiliza datos de cada base de datos. ¿Cuál sería la forma correcta de crear esa conexión de base de datos desde una aplicación java y hay un patrón de diseño adecuado para esta tarea que podría usar?Cómo crear varias conexiones de bases de datos para diferentes bases de datos en java

Respuesta

7

Como no se ha etiquetado su pregunta con todo esto, hibernate, JPA, ORM, supongo que se trata de JDBC normal.

Habiendo dicho eso, sugiero que tenga una capa DAO para tratar con las bases de datos subyacentes, y deje los detalles de la conexión a las implementaciones específicas. Puede configurar sus cadenas de conexión en algunos archivos .properties, digamos.

[Complemento]

También puede hacer uso de la fábrica de DAO, una implementación de Abstract Factory o patrón de fábrica Mathod, lo que se adapta aquí.

[Enlaces]

+0

, pero ¿cómo va a tener múltiples conexiones db? –

+0

@munna: Cada implementación de DAO conocerá su Datasource. –

1

La forma ideal de lograr esto es mediante el uso de un sistema multidimensional como OLAP. Pero mira si puedes crear una vista de esas bases de datos. Entonces solo necesita consultar la vista (es decir, solo una conexión de base de datos única). También puede usar múltiples conexiones de bases de datos si lo desea.

1

Puede manejar múltiples conexiones fácilmente usando una herramienta ORM como Hibernate. Puede especificar cada conexión en un archivo de configuración separado e instanciar la conexión requerida obteniendo una nueva fábrica de sesión cada vez.

Otra forma sería la de utilizar la fuente de datos y JNDI: Java connecting to multiple databases

Creo que se puede utilizar una combinación de patrón de la fábrica y el patrón Singleton para el propósito.

3

hay múltiples maneras que usted puede lograr esto:

  1. Si está utilizando cualquier contenedor Java EE que soporta transacciones distribuidas a continuación, puede utilizar allí funcionalidad.
  2. Si tiene JDBC normal, deberá mantener su propia conexión para cada base de datos. para JDBC:
    1. proporcionar todos los detalles de conexión
    2. Tener una fachada que le da objeto deseado llamando a un DAO genérico abstracto.
    3. tienen una fábrica que crea dao en función de la conexión.
  3. Utilice herramientas ORM como Hibernate, donde puede usar la configuración para múltiples bases de datos. Tutorial.
  4. Si está utilizando Spring, puede configurar un origen de datos por base de datos. Docs

Patrones de diseño:

  • Fachada del modelo - para ocultar la complejidad y el uso de múltiples bases de datos.
  • Fábrica: en caso de que usted mismo administre la conexión de la base de datos.
  • Singleton - Para los orígenes de datos
0

es muy fácil :)

1.Create una fuente de datos para probar la conexión al 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.Crear una base de datos de clase, recuerde cerrar todas las conexiones en este 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(); 
} 
} 

Buena apariencia.

Cuestiones relacionadas