用于与不同类型的DB交互的数据层设计

时间:2016-04-20 05:39:38

标签: java design-patterns

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

Desing的想法:

每种数据库都有3种不同的界面。对于redis,业务层将告诉哪些redis要查找密钥。但问题是如果我们改变redis机器,商务层需要改变。

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

1 个答案:

答案 0 :(得分:0)

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

更新:

这看起来像是一个神奇的情况:看看hibernate分片(我的意思是hibernate的模式用来做出更好的想法)(http://www.ibm.com/developerworks/library/j-javadev2-11/

总之,您可以使用某种" ShardSelectionStrategy" (定义此类界面),其中包含" selectShardIdForNewObject(Object obj)" 根据输入对象参数返回 ShardId

因此,每次要在数据库中插入新对象时,必须将ShardSelectionStrategy对象传递给DAO类,该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层的查询方法。

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