问题: 我们的模块之一是与 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/