【问题标题】:How to create connection for two different data sources in singleton class in java如何在java中的单例类中为两个不同的数据源创建连接
【发布时间】:2018-07-17 22:58:56
【问题描述】:

我有一个类名 DBManager.java,这个类实现了一种单例设计模式,它用于所有 DB 操作。 当我必须连接 1 个数据源时,这非常有效,现在在我的项目中,我必须连接 2 个不同的数据源,现在当我使用这个类时,它的行为会有所不同。因为它总是返回 1 个数据源连接。

现在我该如何以更好的方式来管理它?一种方法是创建另一个 DBManager2.java 类并将该类用于第二个数据源,但我认为这不是一个好方法。

任何建议。

【问题讨论】:

  • 如果你问我,我会很容易地使用 2 个不同的数据源来区分我的关注点。您可以轻松地从接口实现并将这些创建的单例存储在 Map 中。类似 Map
  • DBManager 真的需要成为单身人士吗? DBManager 是通过构造函数还是 setter 注入到 DAO 中?还是一个 DAO 有自我意识并打电话给DBManager.getInstance().getConnection()?发布一些代码,以便我们提出一些重构步骤。

标签: java database design-patterns singleton


【解决方案1】:

使用Map<Key, DataSource> 按某个键存储数据源。然后使用一些key object来获取对应的datasoucre(数据库URL,数据库用户或者一些标识符)

【讨论】:

    【解决方案2】:

    一种方法是创建一个enum,将不同的数据库作为不同的枚举常量:

    public enum Databases{ 
        DB1,
        DB2 
    }
    

    然后在你的 DBManager.getConnection() 方法中使用它:

    public final class DBManager{
        // singleton stuff
    
        public Connection getConnection(Databases d){
            switch(d){
                case DB1:
                    // return connection to db1
                case DB2:
                    // return connection to db2
            }
        }
    }
    

    通过使用开关,您可以为每个数据库创建一个新分支。

    另一种方法是将连接所需的所有信息存储在枚举本身中。虽然那样会有很多安全漏洞,因为您只是将数据库凭据硬编码到您的代码中(不应该这样做)。

    【讨论】:

      猜你喜欢
      • 2012-05-22
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多