我正在寻找一个“十大”列表,列出我们应该通过Web服务连接到远程数据库而不是直接连接到数据库的原因。这是现在的内部辩论,我是亲网络服务但却失去了争论。我对WCF / Web服务有基本的把握,没有其他人可以做到。我们可以做任何我们想要的事情,但我们需要坚持我们现在所选择的任何事情。
这是我想出来的。还有吗?
答案 0 :(得分:108)
安全。您不会向除了Web服务器/应用程序用户之外的任何人授予数据库访问权限。
当您拥有大量用户时,这一点非常重要。您可以避免DB端用户/角色维护的痛苦。
DB负载减少。 Web服务可以缓存从DB检索的数据。
数据库连接池(hat / tip @Dogs)。
Web服务可以使用一小段永久打开的数据库连接。帮助有多种方式:
数据库服务器端的数据库连接池受限。
打开新的数据库连接非常昂贵(特别是对数据库服务器而言)。
容错能力 - 服务可以在主/ DR数据源之间切换,而不会由服务使用者实现故障转移的细节。
可扩展性 - 该服务可以在多个并行数据源之间传播请求,而无需服务使用者实施资源选择的详细信息。
封装。您可以在不影响服务用户的情况下更改基础数据库实施。
数据丰富(包括从客户端自定义到本地化到内部化的任何内容)。基本上任何这些都可能有用,但它们中的任何一个都是数据库的主要负载,并且通常很难在数据库中实现。
可能或可能不适用于您 - 某些架构决策不是DB access友好的。 例如。在Unix上运行的Java服务器可以轻松访问数据库,而在Windows PC上运行的Java客户端不是数据库感知的,也不是您想要的。
可移植性。您的客户可能并非全部使用相同的平台/架构/语言。在每一个中重新创建一个好的数据访问层比为Web服务构建一个消费者层更难(因为它必须考虑上述故障转移等等问题)。
< / LI>性能调整。假设替代方案是客户端运行自己的查询(而不是预先存储的预处理过程),您可以100%确定他们将开始使用不太理想的查询。此外,如果Web服务绑定了一组允许的查询,它可以显着帮助您进行数据库调优。我必须补充一点,这种逻辑同样适用于存储过程,而不是Web服务所独有的。
也可以找到一个好的清单on this page: 'Encapsulating Database Access: An Agile "Best" Practice'
只是要清楚 - 其中一些问题可能并不适用于所有情况。有些人不关心便携性。有些人不需要担心数据库安全性。有些人不需要担心数据库可扩展性。
答案 1 :(得分:14)
在我看来,您不应该自动将数据库公开为Web服务。如果事实证明您需要一个服务来公开您的数据,那么写一个,但不是所有的数据库访问都应该通过Web服务完成。
答案 2 :(得分:11)
大多数这些要点适用于任何正式的API,而不是特定的Web服务。
答案 3 :(得分:2)
编写一个简单地包含对存储过程的调用的Web服务似乎是设计好DAL的错误方法。很可能,您的存储过程是旧客户端 - 服务器系统遗留的遗留代码,即业务规则隐藏在SP中。如果是这样的话,你真的在尝试从母猪的耳朵里创造一个真丝钱包。
此外,您添加了一个SOAP消息协议层,可以为已经“强制”约会“猪”的Web应用程序添加性能影响。我现在正在开展一个项目,我们的新MVC-4应用已被指示使用这样的DAL。每当新的用户故事出现时,我们就必须改变WebMethod签名和SP签名;对我们来说,每一次冲刺都是如此。这种直接方法固有的两个紧密耦合的层次。
答案 4 :(得分:2)
1)维护数据库的头痛从开发人员方面减少,以便他们只关注开发。
2)Web服务以非常简单有效的方式支持不同平台(如windows,ios,android等操作系统)的通信。 例如考虑android应用程序&amp; ios应用程序想要与基于java的网站进行通信,因此对于所有这三件事的通信,webservice是最好的解决方案,而不是维护三个不同的数据库。
答案 5 :(得分:0)
一般
我只是盯着ASP.NET Web Api并计划首先制作数据服务。
我最近一直专注于使用实体框架的.NET MVC Web应用程序。
我最近发现自己陷入了一个令人沮丧的困境,即我最初基于Oracle存储过程构建的MVC Web应用程序。原始版本为Oracle 9甚至更早版本,它提出了Visual Studio 2012的另一个问题,推出了一种更现代的连接工厂方法,加载时间程序集根据Web配置连接和TNS名称查找要使用的正确dll文件。
尝试连接数据库失败,但不再支持&#39;错误消息。出于好奇,我下载了Oracle 12c并进行了一些应用程序级连接,这些连接与我的TNS名称和加载程序集dll很好地协作,我能够毫无问题地使用Oracle。
构建了一些Web服务,这些服务正在与旧的Oracle版本连接。它们是使用专门映射到选定表格的方法构建的,但令我失望。我必须自己写。
我被告知负责维护Oracle数据库的组,他们将编写新的存储过程来替换我用来抽象客户端接口和业务逻辑层的旧存储过程。
所以我的第一个想法是所有常见的数据请求,例如填充下拉列表或自动完成企业级数据,都可以通过调用Oracle存储过程的数据服务完成。为什么要在每个应用程序上重复该过程并让每个开发人员都在配置和版本/负载程序集,TNS问题?
左右....
我是应用程序开发人员/分析师,而不是DBA,所以我的观点来自于在数据库工具发展过程中不断修改应用程序的永无止境的经历。