ライブ サーバー上の sql azure データベースに奇妙な問題があります。MVC コントローラーは、「待機操作がタイムアウトしました」および Sqleexpection (0x80131904): タイムアウトが期限切れになりました」というエラーを返しています。
これは、特に 1 つの 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 インスタンスで復元し、アプリケーション接続をバックアップ db にポイントすると、アプリケーションが動作するため、さらにテストを行いました。
この問題のトラブルシューティング方法がわかりません。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