我们正在使用带有WCF后端的ASP.NET MVC构建外联网贷款状态检查网站。它是一个非常标准的设计,MVC站点使用WCF服务引用来获取客户对象。该服务使用Oracle后端+ http绑定,并且不会与MVC站点托管在同一服务器上(因此我们不能使用tcp绑定来减少延迟)。
我们遇到的问题是,每次调用该服务都会导致7-8秒的响应时间,这对于Extranet站点来说是不可接受的,远远高于2s魔术标记。服务方法调用12个存储过程来创建客户对象。遗憾的是,数据库是非规范化的(我们无法将其更改为其他内部生产系统也使用),因此大多数调用都是基本的select语句,用于填充客户对象及其关联对象。服务代理在MVC操作中正确打开和关闭/处置,因此不存在任何服务连接泄漏的实例。为每个请求创建一个新的客户端代理(即,我们没有使用服务的单例模式)。
我们如何加快速度?
由于
答案 0 :(得分:1)
听起来你已经知道问题所在 - 这是数据库。
我从来没有听说过WCF操作需要花费超过一秒的时间来设置和拆除,排除内部的任何逻辑。因此,即使您可以减少1-2秒的延迟(这可能是一个乐观的估计),如果数据库操作本身需要5-6秒,那也无济于事。
诚实?运行12个存储过程来创建客户是完全不可能的。存储过程的目的是封装执行复杂数据库操作所需的所有逻辑。您需要做的第一件事就是将其更改为一个存储过程 - 然后如果它仍然很慢,请对数据库进行概要分析以查看花费了多长时间并相应地修复它。通常,数据库性能不佳是由于一个或多个缺失索引造成的。
答案 1 :(得分:0)
在准确衡量实际情况之前,不要过于简单地假设瓶颈在哪里。
您确实需要执行Oracle扩展SQL跟踪以查看缓慢来自何处。除此之外的任何事情都是猜测。以下是来自Cary Millsap(方法R和以前的Hotsos)的论文,您可以下载这样做的详细信息: