如何在java中为不同的数据库创建多个数据库连接

时间:2012-05-15 03:04:35

标签: java design-patterns jdbc dao multiple-databases

我有一个应用程序,它使用不同地理位置的四个数据库。所有数据库都包含相同的表,并且只有数据库名称根据位置而不同。 我必须在我的应用程序中创建一些使用每个数据库中的数据的报告。从Java应用程序创建这些数据库连接的正确方法是什么?我可以使用这个任务的合适设计模式吗?

6 个答案:

答案 0 :(得分:7)

由于您没有使用hibernateJPAORM标记您的任何问题,我假设您正在处理纯JDBC。

话虽如此,我建议你有一个DAO层来处理底层数据库,并将连接细节留给特定的实现。您可以在一些.properties文件中配置连接字符串,比如说。

<强> [补]

你也可以使用DAO工厂,抽象工厂或工厂Mathod模式的实现,无论哪个适合。

<强> [链接]

答案 1 :(得分:3)

有多种方法可以实现这一目标:

  1. 如果您使用的是支持分布式事务的任何Java EE容器,那么您可以使用那里的功能。
  2. 如果您使用普通JDBC,则必须为每个数据库维护自己的连接。 对于JDBC:
    1. 提供所有连接详情
    2. 有一个Facade,通过调用抽象的通用DAO为您提供所需的对象。
    3. 有一个基于连接创建dao的工厂。
  3. 使用Hibernate等ORM工具,您可以在其中使用多个数据库的配置。 Tutorial
  4. 如果您使用的是Spring,那么您可以为每个数据库配置一个数据源。 Docs
  5. 设计模式:

    • Facade Pattern - 用于隐藏复杂性和多个数据库使用。
    • 工厂 - 如果您自己管理数据库连接。
    • Singleton - 用于数据源

答案 2 :(得分:1)

实现这一目标的理想方法是使用像OLAP这样的多维系统。但是看看你是否可以从这些数据库中创建一个视图。然后你只需要查询视图(即只是一个数据库连接)。如果需要,您仍然可以使用多个数据库连接。

答案 3 :(得分:1)

您可以使用像Hibernate这样的ORM工具轻松处理多个连接。您可以在单独的配置文件中指定每个连接,并通过每次获取新的会话工厂来实例化所需的连接。

其他方式是使用数据源和JNDI:Java connecting to multiple databases

我认为您可以将Factory模式和Singleton模式的组合用于此目的。

答案 4 :(得分:0)

很容易:)

1.创建数据源以尝试连接到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.创建一个类DataBase,记住在这一点上关闭所有连接。

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();
}
}

好看。

答案 5 :(得分:0)

假设您将Spring MVC与具有XML配置的Hibernate一起使用,请按照以下步骤操作:

  1. spring-servlet文件中创建所有数据库的bean。

    <bean id="dataSource1" Class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=database1"/>
            <property name="username" value="abc" />
            <property name="password" value="abc@123" />
        </bean>
    
  2. 在Spring-servlet文件中创建所需的所有数据库的sessionFactory bean。

    <bean id="datasource1SessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource"
              ref="database1"/>
            <property name="packagesToScan"
              value="com.id4.iprod.entity"/>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.hbm2ddl.auto">
                    </prop>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.SQLServer2012Dialect
                    </prop>
                </props>
            </property>
        </bean>
    
  3. 现在,您只需要在DAO中打开想要的数据库会话并从所需的数据库访问所需的结果即可。

    Session datasource1= this.datasource1SessionFactory.openSession();