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

18

我有一个应用程序,在不同的地理位置使用四个数据库。所有数据库都包含相同的表,只是根据位置不同使用不同的数据库名称。 我需要在我的应用程序中创建一些报告,这些报告使用来自每个数据库的数据。从Java应用程序创建这些数据库连接的适当方法是什么?是否有适合此任务的设计模式可以使用?

6个回答

7
由于您没有在问题中标记任何hibernateJPAORM,因此我假设您正在处理普通的JDBC。

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

[补充]

您还可以使用DAO工厂,它是Abstract Factory或Factory Method模式的实现,视情况而定。

[链接]


但是你如何拥有多个数据库连接? - Ashish K Agarwal
@munna:每个DAO实现都将知道它的数据源。 - Adeel Ansari

4

您有多种方法可以实现这个:

  1. 如果您正在使用任何支持分布式事务的Java EE容器,则可以使用其功能。
  2. 如果您使用普通的JDBC,则需要为每个数据库维护自己的连接。 对于JDBC:
    1. 提供所有连接详细信息
    2. 拥有一个Facade,通过调用抽象通用DAO来给您所需的对象。
    3. 拥有一个工厂,根据连接创建DAO。
  3. 使用ORM工具,如Hibernate,在其中可以使用配置多个数据库。 教程
  4. 如果您使用Spring,则可以为每个数据库配置一个数据源。 文档

设计模式:

  • 外观模式 - 用于隐藏复杂性和多个数据库的使用。
  • 工厂模式 - 在您自己管理数据库连接的情况下。
  • 单例模式 - 用于数据源

2

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

另一种方法是使用数据源和JNDI:Java连接多个数据库

我认为您可以将Factory模式和Singleton模式组合使用以达到目的。


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

0

非常简单 :)

1.创建一个数据源以尝试连接到数据库

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

祝你好运。


0

假设您正在使用Spring MVC与Hibernate和XML配置,请按照以下步骤操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接