我正在寻找“十佳”列表,列出为什么我们应该通过Web服务连接到远程数据库而不是直接连接到数据库。目前这是内部辩论,我是支持Web服务的专家,但失败了。我对WCF / Web服务有基本的了解,其他人没有。我们可以做任何我们想前进的事情,但我们需要坚持现在选择的一切。
这是我想出的。还有吗
- 如果配置正确,则WCF Web服务可以更安全。
- 对数据库的更改仅需要在服务级别(配置文件或重新编译服务)进行。
- 设置和托管后,Web服务将更易于使用。
Answers:
安全。您不向除Web服务器/应用程序用户以外的任何人授予数据库访问权限。
当您有大量用户时,这尤为重要。您避免了数据库方面用户/角色维护的麻烦。
DB负载减少。Web服务可以缓存从数据库检索到的数据。
数据库连接池(hat / tip @Dogs)。
Web服务可以使用一小部分永久打开的数据库连接。这些帮助有多种方式:
数据库连接池在数据库服务器端受到限制。
打开新的数据库连接非常昂贵(尤其是对于数据库服务器)。
容错能力-服务可以在主要/ DR数据源之间切换,而无需由服务使用者实现故障转移的详细信息。
可伸缩性-服务可以在多个并行数据源之间分发请求,而无需让服务使用者实现资源选择的详细信息。
封装。您可以更改基础数据库的实现,而不会影响服务用户。
数据充实(这包括从客户端定制到本地化到内部化的所有内容)。基本上,这些方法中的任何一个都可能有用,但是它们中的任何一个都是数据库的主要负担,并且通常很难在数据库内部实现。
可能适用或可能不适用于您-某些体系结构决策对DB acces不友好。例如,在Unix上运行的Java Server可以轻松访问数据库,而在Windows PC上运行的Java客户端不支持数据库,您也不希望这样做。
可移植性。您的客户不一定都在同一平台/体系结构/语言上。与为Web服务构建使用者层相比,在其中的每个层中重新创建一个良好的数据访问层都更加困难(因为它必须考虑到上述故障转移/等问题)。
性能调优。假设替代方法是客户端运行自己的查询(而不是预先安装的存储过程),则可以100%确保它们将开始使用少于最佳查询的状态。另外,如果Web服务限制了允许查询的范围,则可以大大帮助您进行数据库调整。我必须补充一点,该逻辑同样适用于存储过程,而不是Web服务所独有。
在此页面上也可以找到一个好的列表:“封装数据库访问:敏捷的“最佳”实践”
只是要明确地说-其中一些问题可能并不适用于所有情况。有些人不关心可移植性。有些人不需要担心数据库安全性。有些人不需要担心数据库可伸缩性。
我认为,您不应自动将数据库作为Web服务公开。如果事实证明您需要一种服务来公开您的数据,请编写一个,但是并非所有数据库访问都应该通过Web服务来完成。
这些要点中的大多数都适用于任何正式的API,而不是专门用于Web服务。
编写仅包装对存储过程的调用的Web服务似乎是设计好的DAL的错误方法。您的存储过程很有可能是旧的客户端-服务器系统遗留的遗留代码,即业务规则埋在SP中。如果是这种情况,您实际上是在尝试从母猪的耳朵中创建一个丝绸钱包。
此外,您添加了一个SOAP消息协议层,从而对已经“强制”约会此“猪”的Web应用程序增加了性能影响。我现在正在一个项目中,我们的新MVC-4应用已被指示使用这种DAL。每当有新的用户案例需要进行更改时,我们都必须更改WebMethod签名和SP签名。对我们来说,这是每一个冲刺。这种直通方法固有的是两个紧密耦合的层。
一般来说
我只是盯着ASP.NET Web Api,并计划首先制作数据服务。
最近,我一直在使用实体框架来关注.NET MVC Web应用程序。
最近,我发现自己对最初基于Oracle存储过程构建的MVC Web应用程序感到沮丧。最初的版本是Oracle 9或更早版本,它带来了Visual Studio 2012的另一个问题,它推动了一种更现代的连接工厂方法,即加载时程序集根据Web配置连接和TNS名称查找要使用的正确dll文件。
尝试连接到数据库失败,并显示“不再受支持”错误消息。出于好奇,我下载了Oracle 12c,并进行了一些应用程序级别的连接,这些连接可以很好地与TNS名称和装入程序集dll配合使用,并且我可以毫无问题地使用Oracle。
有一些构建的Web服务正在与旧Oracle版本建立连接。它们是使用专门映射到所选表的方法构建的,但令我感到失望的是。我必须自己写。
有人告诉我,负责维护Oracle数据库的小组将编写新的存储过程,以替换我用来抽象化客户端接口和业务逻辑层的旧存储过程。
因此,我首先想到的是,所有常见数据请求(例如填写下拉列表或使用企业范围的数据自动完成)都是通过调用Oracle存储过程的数据服务来完成的。为什么要在每个应用程序上重复该过程,并让每个开发人员都在配置和版本/装入程序集,TNS问题上挣扎?
所以....
我是一名应用程序开发人员/分析师,而不是DBA,因此我的观点是从经验中获得的,这是随着数据库工具的发展而不断修改应用程序所带来的无尽挫败感。