2

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

任何帮助将不胜感激。

谢谢

在此处输入图像描述

于 2013 年 3 月 13 日编辑

经过进一步调查 - 问题似乎与从子过程 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
4

0 回答 0