我在实时服务器上使用我的sql azure数据库时遇到了奇怪的问题。 MVC控制器返回错误为“等待操作超时”和Sqlexpection(0x80131904):超时已到期“。
特别是在单个sql存储过程中发生这种情况。该程序是如果使用SMSS 2012对数据库运行具有相同参数的存储过程,它运行正常并在2秒内返回返回。
这让我觉得我的存储过程没有任何问题。
我正在调用存储过程如下。
List<FileFolderItem> folders = new List<FileFolderItem>();
using (DFModel db = new DFModel())
{
folders.AddRange(
db.GetFolderStructure(companyId, (clientid ?? companyId), folderId, currentUser.df_userId).Select(x => new FileFolderItem
{
Name = x.name,
Id = x.id,
Flags = "USER_FOLDER",
TotalFiles = x.Files.Value,
TotalSize = x.Size.Value
}).ToList<FileFolderItem>()
);
return folders;
}
我已经做了进一步的测试,通过备份数据库并在相同的sql azure实例上恢复为单独的新数据库,并将我的应用程序连接指向备份数据库并且应用程序正常工作。
我不明白我该怎么解决这个问题,没办法重启sql azure实例。
任何帮助都将受到高度赞赏。
由于
于13/03/2013编辑
经过进一步调查 - 问题似乎是从子程序GetFolderTotalSize调用的表值函数(getfilesbyclaims)。是否完全支持此功能。奇怪的是,应用程序确实在大约4周前上线,这个问题在昨天下午4点突然开始。
CREATE PROCEDURE [dbo].[GetFolderStructure]
@companyid int,
@clientid int,
@folderid int,
@personid int
AS
SELECT
fd.id,
fd.name,
dbo.getfoldertotalfiles(@companyid, @clientid, fd.id, @personid) AS Files,
--0 as Files,
dbo.getfoldertotalsize(@companyid, @clientid, fd.id, @personid) as Size
--0 as Size
FROM folders fd
WHERE fd.companyid = @companyid
AND fd.root_id = @folderid
AND (fd.hidden IS NULL OR fd.hidden = 0)
子程序 - GetFolderTotalFiles
ALTER FUNCTION [dbo].[GetFolderTotalSize]
(
@companyid int,
@clientid int,
@folderid int,
@personid int
)
RETURNS INT
AS
BEGIN
DECLARE @size int;
DECLARE @tblFiles TABLE (
Id uniqueidentifier not null,
CompanyId int,
folderid int,
contentLength bigint
);
INSERT INTO @tblFiles(id, companyid, folderid, contentlength)
SELECT * FROM dbo.getfilesbyclaims(@clientid, @personid);
WITH Folder_CTE as (
select fs.* FROM folders AS fs
where companyid = @companyid
AND id = @folderid
UNION ALL
SELECT f.* FROM folders f
INNER JOIN Folder_CTE fcte ON fcte.id = f.root_id)
SELECT @size = ISNULL(SUM(f.contentlength), 0) FROM folder_cte fd
INNER JOIN @tblFiles f ON f.folderid = fd.id
where f.companyid = @clientid
return @size;
END
GO