为什么开发人员应该使用Web服务而不是直接连接到数据库?

Den*_*ail 89 wcf web-services

我正在寻找一个"十大"列表,列出我们应该通过Web服务连接到远程数据库而不是直接连接到数据库的原因.这是现在的内部辩论,我是亲网络服务但却失去了争论.我对WCF/Web服务有基本的把握,没有其他人可以做到.我们可以做任何我们想要的事情,但我们需要坚持我们现在选择的任何东西.

这就是我想出来的.还有吗?

  1. 如果配置正确,WCF Web服务可以更安全.
  2. 只需在服务级别(配置文件或重新编译服务)进行对DB的更改.
  3. 设置和托管后,Web服务更容易使用.

DVK*_*DVK 111

  1. 安全.除了Web服务器/应用程序用户之外,您不会向任何人授予数据库访问权限.

    当您拥有大量用户时,这一点非常重要.您可以避免DB端用户/角色维护的痛苦.

  2. DB负载减少.Web服务可以缓存从DB检索的数据.

  3. 数据库连接池(hat/tip @Dogs).

    Web服务可以使用一小段永久打开的数据库连接.有多种方式的帮助:

    • 数据库服务器端的数据库连接池是有限的.

    • 打开新的数据库连接是非常昂贵的(特别是对数据库服务器).

  4. 容错能力 - 服务可以在主/ DR数据源之间切换,而不必由服务使用者实现故障转移的细节.

  5. 可伸缩性 - 服务可以在多个并行数据源之间传播请求,而无需服务使用者实现资源选择的细节.

  6. 封装.您可以更改基础数据库实施,而不会影响服务用户.

  7. 数据丰富(包括从客户端定制到本地化到内部化的任何内容).基本上任何这些都可能是有用的,但它们中的任何一个都是数据库的主要负载,并且通常很难在数据库中实现.

  8. 可能或可能不适用于您 - 某些架构决策不是DB访问友好的.例如,在Unix上运行的Java服务器可以轻松访问数据库,而在Windows PC上运行的Java客户端不具备数据库感知能力,也不是您想要的.

  9. 可移植性.您的客户可能并非全部使用相同的平台/架构/语言.在每个中重新创建一个良好的数据访问层比为Web服务构建消费者层更难(因为它必须考虑上述故障转移/等等问题).

  10. 性能调整.假设替代方案是客户端运行自己的查询(而不是预先存储的预处理过程),您可以100%确定他们将开始使用不太理想的查询.此外,如果Web服务绑定了一组允许的查询,它可以显着帮助您进行数据库调优.我必须补充一点,这种逻辑同样适用于存储过程,而不是Web服务所特有的.

在这个页面上也可以找到一个好的列表:'封装数据库访问:敏捷"最佳"实践"

简而言之 - 其中一些问题可能并不适用于所有情况.有些人不关心便携性.有些人不需要担心数据库安全性.有些人不需要担心数据库可扩展性.

  • 对不起,不同意.1.因此,您授予DB访问组而不是单个主体 - 没有区别.2.任何应用都可以缓存数据.在任何情况下,可以跨多个用户缓存的数据类型通常都是低容量数据.3.无论如何,FT应由数据库处理.这不是一个开箱即用的功能,必须进行编程.5.您的数据访问层应该进行封装.6.同样的事情.真的吗?JDBC不在客户端运行?好点,重要的是,这很少见.9.查询与SP不是问题的一部分. (24认同)
  • 1.尝试使用各种角色管理5000个用户.不再那么好了.2.完全取决于应用程序.我们当前的案例有一个缓存查询结果的实例,在优化的情况下运行需要20分钟,而且我们需要每天至少从不同的应用程序运行100次.FT在很多层面上处理.你是什​​么意思"应该由数据库处理"? (6认同)
  • 当然必须编程.但它可以编程到服务中一次,或者编程到具有不同功能的各种平台上的无数客户端应用程序中.有一个重大区别.别担心负载平衡的配置管理问题.5.同样的推理.您无需重新实施DAL.事实上,您可以将Web服务视为便携式DAL,以放松您的想法.7.我们不希望每个客户端都打开数据库连接.要求这么大的事吗?再一次,你忘记了第1-5点. (3认同)
  • 8.> 1客户端架构经常发生.事实上,在我生命中没有这种情况的情况下,我从未参与过一个项目,但我的中心是金融世界.9.事实并非如此.我基本上是扮演魔鬼的拥护者. (2认同)
  • 我喜欢这个答案,但我认为你跳过了最重要的一点:连接池.如果您有1,000,000个客户端,那么您将要么拥有1,000,000个打开的连接,要么持续打开和关闭数百万个连接.关于计算机组织的基本直觉告诉我们,一百个长寿命连接的良好调整池在天文数据上比拥有一百万个长寿命或数百万个短期连接更有效.HikariCP很好地阐述了这个想法:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing (2认同)

Joh*_*ers 14

在我看来,您不应该自动将您的数据库公开为Web服务.如果事实证明您需要一个服务来公开您的数据,那么写一个,但不是所有数据库访问都应该通过Web服务完成.

  1. 数据库连接没有理由不安全
  2. 您可以将数据库封装在数据访问层(可能是实体框架)中
  3. 与编写良好的数据访问层相比,Web服务并不容易消费.


bra*_*ter 11

  • Web Services构成API,定义外部系统与应用程序数据之间允许的交互.
  • Web服务将数据库与外部交互分离,并使数据层能够独立于外部影响进行管理.
  • 仅允许Web服务访问可确保应用程序逻辑有机会执行,从而保护数据完整性.
  • 与需要用户名和密码/表级权限的数据库相比,Web服务允许采取最合适的身份验证/授权措施.
  • Web服务提供了使用自动服务发现和配置的机会.
  • 可以加密Web服务流量,以便通过不安全的网络进行传输.不知道任何直接的数据库连接解决方​​案能够实现......?

大多数这些要点适用于任何正式的API,而不是特定的Web服务.