java - 用于与不同类型的数据库交互的数据层设计

标签 java design-patterns

问题: 我们的模块之一是与 3 种不同的 redis [不同的 redis 将具有不同的 redis-KEYS]、mongo DB 和 mySQL 进行交互。 我们应该如何设计数据层,以便将来如果我们改变数据库,我们不需要改变业务层。

设计思路:

每种数据库将有 3 个不同的接口(interface)。对于redis,bussiness 层会告诉哪个redis 去寻找key。但问题是,如果我们更换 Redis 机器,则需要更改业务层。

有没有标准的方法来处理这种情况?任何帮助将不胜感激。

最佳答案

我认为针对特定键使用哪个redis的逻辑与数据访问层有关而不是业务层,因此业务层只告诉DAO层检索键,DAO层将决定必须使用哪个redis实例用过。

更新:

这似乎是一种分片情况:看看 hibernate 分片(我的意思是 hibernate 用来产生更好想法的模式)(http://www.ibm.com/developerworks/library/j-javadev2-11/)

总而言之,您可以使用某种"ShardSelectionStrategy"(定义此类接口(interface)),它具有返回ShardId 的"selectShardIdForNewObject(Object obj)" 基于输入对象参数。

所以每次你想在数据库中插入一个新对象时,你必须将一个 ShardSelectionStrategy 对象传递给你的 DAO 类,该类具有为对象选择正确分片的知识,上面文章中的示例是:

if (obj instanceof Race) {
   Race rce = (Race) obj;
   return this.determineShardId(rce.getDistance());
} else if (obj instanceof Runner) {
   //Do Something
}

因此该策略根据比赛距离确定分片 ID。

Hibernate 在通过其键搜索对象时也使用“ShardResolutionStrategy”,并在每次需要查询数据库时将其传递给 DAO 层的查询方法。

希望这些信息对您有所帮助。

关于java - 用于与不同类型的数据库交互的数据层设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36734718/

相关文章:

java - 在Gradle的Java测试中使用Scala类

java - 对由整数对组成的列表进行排序

c# - 多阶段状态的嵌套类

oop - 在 MVP 中, View (又名页面)是否应该知道模型的任何信息?

oop - Golang 在具有私有(private)访问权限的结构中嵌入接口(interface)

java - 如何将 POS 表中的数量减去产品表中的数量

java - java中的分词器或在多个空格处分割字符串

java - 使用函数式编程在java中关闭文件

带有 Objective C 示例的 iOS 模式,用于防止对方法的并发调用

design-patterns - 为什么解释器模式很糟糕?