我负责开发和维护一组以类似数据为中心的Web应用程序.我当时决定的架构是,每个应用程序都有自己的数据库和web根应用程序.每个应用程序都维护一个到自己数据库的连接池,以及一个用于共享数据(登录等)的中央数据库

一位同事一直认为,这种策略不会扩展,因为有这么多不同的连接池是不可扩展的,我们应该重构数据库,以便所有不同的应用程序都使用一个单一的中央数据库,并且系统特有的任何修改都需要从该数据库中反映出来然后使用由Tomcat提供动力的单个池.他假设有很多"元数据"在网络中来回传输,以维护连接池.

我的理解是,通过适当的调整,在不同的池中只使用必要数量的连接(低容量应用程序获得的连接较少,高容量应用程序获得的连接数量较多,等等).pools的数量与connections的数量相比无关紧要,或者更正式地说,与1个30个连接的池相比,维护3个10个连接的池所需的开销差异可以忽略不计.

最初将系统拆分成一个应用程序-一个数据库的设计背后的原因是,应用程序之间可能会有差异,并且每个系统都可以根据需要对架构进行修改.同样,它消除了系统数据渗漏到其他应用程序的可能性.

不幸的是,公司里没有强有力的领导层来做出艰难的决定.虽然我的同事只是含糊其辞地支持他的担忧,但我希望确保我理解多个小型数据库/连接与一个大型数据库/连接池之间的差异.

推荐答案

你最初的设计是以合理的原则为基础的.如果它对你的情况有帮助,这个策略被称为horizontal partitioning or sharding.它提供:

1)更高的可伸缩性-因为如果需要,每个碎片可以驻留在单独的硬件上.

2)可用性更高-因为单个碎片的故障不会影响其他碎片

3)更高的性能-因为被搜索的表具有更少的行,因此索引更小,从而产生更快的搜索.

你同事的建议会让你陷入单点故障设置.

至于您提出的关于3个大小为10的连接池与1个大小为30的连接池的问题,解决这一争论的最好方法是使用基准测试.每种方式配置你的应用程序,然后用ab(Apache基准测试)进行一些压力测试,看看哪种方式性能更好.我怀疑不会有很大的差别,但做基准来证明这一点.

Database相关问答推荐

第一次请求后数据库连接关闭

如何高效地存储 100 万个单词并通过starts_with、contains 或ends_with 进行查询?

获取总和列的比率

Active Record - 获取数据库中的第二个、第三个.. 项(无 ID)

Sequel Pro / MAMP 在哪里存储本地数据库?

数据库术语中的relation关系是什么意思?

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

502 是数据库错误的适当状态代码吗?

如何将 MySQL 5.5.40 升级到 MySQL 5.7

在 MongoDB 中模拟关系

如何最好地在 MS SQL Server 中复制整个数据库?

NoSql DB 和 OO Db 有什么区别?

本地数据库,我需要一些例子

自动增量唯一标识符

ORA-00060: deadlock detected while waiting for resource

MySQL是否允许使用点创建数据库?

QSqlDatabase & QSqlQuery 的正确方法是什么?

Twisted + SQLAlchemy 和最好的方法

Rails:'schema.rb' 中的版本号是否用于任何用途?

字符串列上的postgresql索引