具有多个数据库的Spring + MyBatis的最佳方法,以支持故障转移

时间:2012-05-11 13:15:51

标签: java spring architecture mybatis

我需要开发一些服务并向某些第三方公开API。 在那些服务中,我可能需要通过一些复杂的计算来获取/插入/更新/删除数据(而不仅仅是简单的CRUD)。我打算使用Spring和MyBatis。

但真正的挑战是将有多个具有相同数据的数据库节点(一些外部设置将负责保持它们同步)。当我收到一些数据请求时,我需要随机选择一个数据库节点并查询它并返回结果。如果所选的数据库无法访问或出现网络问题或某些未知问题,那么我需要尝试连接到其他某个数据库节点。

我知道Spring的AbstractRoutingDataSource。但是在哪里注入数据库连接重试逻辑?如果我动态切换dataSource,Spring会正确处理事务吗?

或者我应该避免使用Spring& MyBatis是开箱即用的集成,我自己使用MyBatis进行事务管理?

你们有什么建议?

2 个答案:

答案 0 :(得分:1)

我建议您使用像MongoDB这样的NoSQL数据库。这很容易聚类。例如,您可以配置使用10台服务器并进行3次数据复制。

这意味着,如果您的10台服务器中有2台发生故障 - 您仍然可以保存数据。

NoSQL数据库与RDBS相比有所不同,但它们可以为群集提供高性能。

此外,NoSQL没有交易支持 - 您必须在财务操作时手动执行此操作。

实际上,在使用NoSQL进行开发时,你应该采用不同的方式。

答案 1 :(得分:1)

是的,它会起作用。获取AbstractRoutingDataSource并编写自己的代码。您不能做的唯一事情是在事务运行时更改目标数据库。

所以你需要做的是将db重试代码放在getConnection中。如果在事务期间连接失效,则应该让它失败。