道接口可用于多个数据库?

时间:2018-11-10 16:29:00

标签: java spring rest software-design

有一种在DAO interface之前制作DAO implementation的模式。我对这种模式的优势进行了谷歌搜索,其中一个引人注目的是支持多个数据库。

现在,我能理解的是,这里的多个数据库意味着不同的数据库引擎,而不是多个数据源。显然,多个数据源不应影响如何从DAO接口中实现DAO实现。

我的问题是,在什么情况下我们可能需要支持提供相同数据的多个数据库引擎?另外,如果出现这种需求,将如何管理REST endpoints以支持不同的数据库?

他们会像/db1/courses//db2/courses?如果我在这个问题上有任何错误的假设或陈述,请纠正我。

3 个答案:

答案 0 :(得分:1)

我遇到了这种情况,我不得不检查两个DB并获取数据。另一个数据库是备份数据库。

这就是流程。

  RestController --> Service --> DBService 
                                           --> DB1Repository --> Connect to DB1
                                           --> DB2Repository --> Connect to DB2

我们可以根据需要进行设计,最后最重要的是我们遵循SOLID原则。 基本上,高级组件不应依赖于低级组件,而两者都应取决于抽象。

答案 1 :(得分:1)

我只是想添加有关开始Spring开发的答案。这是起初没有任何意义的事情之一。您最终会问自己:

  • 只有1个数据库,所以为什么这样做没有道理?
  • 当只有一种实现时,为什么要定义一个接口?

但实际上,这两个都不是您这样做的真正原因。但这是惯例和模式,而这种风格正是人们习惯的习惯,随着时间的推移,您会更喜欢它。还有其他一些原因:

  • Spring数据-这是使用实体管理器的替代方法,您只需定义接口,Spring就会实际创建可为您实现存储库功能的bean。
  • 设计-确保定义一个接口将有助于将您的存储库保留为存储库。
  • 更轻松的模拟-尽管可以说您仍然可以在Spring中执行此操作而无需定义接口,但是当您要用另一个实现替换时,它仍然会更加干净。

但是实际上这只是Spring的方式,如果您这样做,人们会发现它更容易理解您的代码。

答案 2 :(得分:0)

这里我会弹出来描述一个真实的例子。

我们最近想将一个大型生产数据库(Oracle)更改为另一个数据库(SQL Server)。

对于数据库的不同区域,我们有不同的DAO接口和实现。例如,CustomerDAO,AccountsDAO等。

对于每个接口(例如CustomerDAO),我们都有一个实现(CustomerDAOImplOracle)。

对于我们来说,编写DAO的SQL Server版本(SQL语法和jdbc库当然是不同的)并交换它们而对我们的业务逻辑(使用DAO的服务)进行最小的更改是相对直接的。

因此,在CustomerDAOImplSQLServer上重新实现了CustomerDAOImplOracle。等等...

我们学到的东西:

  1. 接口可提供良好的抽象效果并允许多种实现方式
  2. DAO层允许我们在必要时“切换”数据库(或其客户端库)
  3. 从业务逻辑中隐藏数据库的实现细节可减少耦合和复杂性