【问题标题】:How to create multiple database connections for different databases in java如何在java中为不同的数据库创建多个数据库连接
【发布时间】:2012-05-22 13:06:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    由于您没有用hibernateJPAORM 标记您的问题,我假设您正在处理普通的 JDBC。

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

    [补充]

    您也可以使用 DAO 工厂,这是抽象工厂或工厂方法模式的实现,无论哪种方式适合这里。

    [链接]

    【讨论】:

    • 但是你将如何拥有多个数据库连接?
    • @munna:每个 DAO 实现都会知道它的数据源。
    【解决方案2】:

    有多种方法可以实现:

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

    设计模式:

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

    【讨论】:

      【解决方案3】:

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

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

      我认为您可以结合使用工厂模式和单例模式。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          很容易:)

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

          好看。

          【讨论】:

            【解决方案6】:

            假设您使用带有 XML 配置的 Hibernate 的 Spring MVC,请执行以下步骤:

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

            【讨论】:

              猜你喜欢
              • 2017-12-31
              • 1970-01-01
              • 2020-07-07
              • 2021-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-09
              • 1970-01-01
              相关资源
              最近更新 更多