等待操作超时且sqlexception超时已过期

时间:2013-03-12 22:05:10

标签: asp.net-mvc-3 azure-sql-database

我在实时服务器上使用我的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实例。

任何帮助都将受到高度赞赏。

由于

enter image description here

于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

0 个答案:

没有答案