我希望这是发布此内容的正确网站。我不确定我是否应该发布这里或服务器故障,但看到这涉及到网站的观点,我想也许这个社区可能会更准确一点,但我不是100%就此。< / p>
我一直在撞墙超过半年,试图弄清楚这里发生了什么。如果我能通过我们的Site Server来追踪AJAX调用的速度很慢,我会欣喜若狂。
我为我所工作的组织构建了一个小型网络应用程序,它几乎就像这样设置:
站点本身(WebMatrix IIS Express站点)驻留在站点服务器上,但(在C#的帮助下)它使用SQL查询来查询数据库服务器上的(相当大的)数据库。
问题是,当我的网站执行需要它查询数据库的AJAX(简单的jQuery $.ajax()
调用)时,响应需要5秒钟,每个!
(Chrome网络详细信息):
(您会看到某些回复非常快。这些回复中包含的数据不会比其他回复少得多。也许在某个地方造成网站的数据限制服务器来分析它们吗?)
现在这里是踢球者:
在开发计算机上,开发站点的本地计算机,切断Site Server,具有相同的代码,并查询同一个数据库,但 lag 不会持续存在在这种情况下。这种情况下的响应是低毫秒,正如我所期望的那样。
以下是Chrome网络详细信息从开发计算机中看到的内容:
(甚至没有接近1秒,更不用说5)。
更具体细节
什么可以使这个应用程序在本地计算机上运行良好,但不能从Site Server运行?我认为问题必须是Site Server,考虑到这一点,但它的资源都没有最大化或任何东西。如果返回的数据超过一定数量(这个数量看起来很低,老实说),似乎每个请求只会滞后约5秒。
事实是,我绝望地被困在这里。我们在过去的几个月里尝试了所有的东西(我们在另一个内部网站点遇到了类似的问题,其中AJAX调用也滞后于那里,我们刚刚使用它一段时间了。)
我不知道还有什么可以查看。
如果有人想看一些代码
jQuery(其中一个AJAX请求,它们都是用不同参数重复的)
$.ajax({
url: '/AJAX Pages/Get_Transactions?dep=1004',
async: false,
type: 'GET',
dataType: "json",
contentType: "application/json",
success: function (trans) {
for (var i = 0; i < trans.length; i++) {
trans[i][0] = getTimeStamp(trans[i][0]);
}
jsonObj1004 = trans;
},
error: function (jqXHR, textStatus, error) {
alert("Oops! It appears there has been an AJAX error. The Transaction chart may not work properly. Please try again, by reloading the page.\n\nError Status: " + textStatus + "\nError: " + error);
}
});
C#服务器端代码(使用Razor)
@{
Layout = "";
if (IsAjax)
{
var db = Database.Open("OkmulgeeCIC");
Dictionary<string, double> dataList = new Dictionary<string, double>();
var date = "";
var previousDate = "";
double amount = 0;
string jsonString = "[";
string queryDep = "SELECT ba_trans_entered AS transDate, (ba_trans_amount * -1) AS transAmount FROM BA_VTRANS WHERE ba_trans_year >= 2011 AND ba_trans_operator = 'E' AND ba_trans_system = 'AP' AND ba_trans_ledger LIKE @0 + '%' ORDER BY ba_trans_entered ASC";
string dep = Request.QueryString["dep"];
foreach (var row in db.Query(queryDep, dep))
{
date = row.transDate.ToString();
date = date.Substring(0, date.IndexOf(" "));
amount = Convert.ToDouble(row.transAmount);
if (date == previousDate)
{
dataList[date] = dataList[date] + amount;
}
else
{
dataList.Add(date, amount);
}
previousDate = date;
}
foreach (var item in dataList)
{
jsonString += "[";
jsonString += Json.Encode(item.Key) + ", ";
jsonString += Json.Encode(item.Value) + "],";
}
//jsonString += Json.Encode(date);
jsonString = jsonString.TrimEnd(',');
jsonString += "]";
@Html.Raw(jsonString)
}
else
{
Context.RedirectLocal("~/");
}
}
来自SQL SERVER PROFILER的ADDITONAL信息
来自开发机器
来自用户计算机(延迟)
答案 0 :(得分:1)
只是查看你的代码,我跳出了两件事
1)您没有关闭数据库连接,这非常糟糕。将您的连接对象包装在使用块中(首选)或在数据工作结束时添加对.Close()
的调用
using(var db = Database.Open())
{
//do work
}
2)在这样的循环中进行字符串连接是一件非常糟糕的事情。使用StringBuilder。或者,因为您无论如何都要输出JSON,只需将对象捆绑到列表或其他内容中,然后将其传递给JSON.Encode()
(首选)
答案 1 :(得分:0)
在我看来,这个问题来自你的Site Server,但无论如何你可以试试这个: 1 /将您的站点发布到任何Internet Web服务器。如果它仍然很慢=&gt;你的代码问题 - &gt;检查你的代码。 如果没有转到2 /检查您的配置站点服务器和数据库服务器。它可能是防火墙或TCP / IP:两个服务器之间的端口或NETBIOS /域名。
答案 2 :(得分:0)
我不知道这是否与此问题有任何关联,因为我无法看到您如何调用您的应用程序。但是当我使用域名调用其他服务器时,我有多次使用C#在IIS上经历了大约5秒的延迟(这也可以是localhost)。而应该使用ip。
如果您尝试使用IP而不是使用域
来玩这个可能会很好答案 3 :(得分:0)
在使用AjAX和JSF网站时,我有类似的东西。
Jquery loading taking excessive time
由于您已经在开发机器上使用它,因此在您的情况下可能不是问题。 但是要排除任何这样的场景,你可以在不使用jquery的情况下开发页面吗?
答案 4 :(得分:0)
我有一个类似的问题,我会使用for循环调用20个sprocs,它们不是大的sprocs介意你,而是一个将返回5个值的sproc。
它可以正常工作但是时不时会出现延迟,并且无法加载任何一个或很少的数量,直到完全超时。
那时我发现了SQL Server的参数嗅探。
要修复它,我在sproc参数中添加了等于来自我的C#代码的传入参数。
旧代码:
CREATE PROC [dbo].[sp_procname_proc]
(
@param1 int,
@param2 int,
@param3 varchar(5),
--..... etc .....
)AS
BEGIN
-- select from db
END
新代码
CREATE PROC [dbo].[sp_procname_proc]
(
@param1 int,
@param2 int,
@param3 varchar(5),
--..... etc .....
)AS
BEGIN
@localParam1 INT = @param1
@localParam2 INT = @param2
@localParam3 varchar(5) = @param3
-- select from db using new parameters
END