我根据答案重写了以下内容。
我有一个网站导致数据库服务器上出现高 CPU 问题,以至于服务器变得不可用。回收应用程序池可解决此问题。根据服务器管理员http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en显示有大约一个小时的活动线程。
在我们向应用程序添加 Web 表单路由之前,与数据库的交互非常简单且有效。
它们仅由整个应用程序中的此类代码组成。是的,这段代码并不完美,但不是这段代码有问题,因为在我们添加路由之前,没有问题。
private string GetPublishedParagraphs()
{
string query, paragraphs = "";
try
{
m_sql_connection = new SqlConnection(m_base_page.ConnectionString());
query = "select * from PublishedParagraphs where IDDataContent_page='" + m_IDDataContent_page + "'";
SqlDataAdapter da = new SqlDataAdapter(query, m_sql_connection);
DataSet ds = new DataSet();
da.Fill(ds, "paragraph");
if (ds.Tables["paragraph"].Rows.Count > 0)
paragraphs = (string)ds.Tables["paragraph"].Rows[0]["paragraphs"];
ds.Dispose();
da.Dispose();
}
finally
{
m_sql_connection.Close();
}
paragraphs = paragraphs.Replace("™", "™");
return paragraphs;
}
连接字符串如下所示:
server_name; User ID=server_user; Password=server_password
我们仔细检查了对数据库 Open() 的每次调用都跟在 Close() 之后。当我们在本地运行应用程序时,我们通过查看它们来测量没有打开的连接,并且连接数不会通过以下方式增加:
SELECT SPID,
STATUS,
PROGRAM_NAME,
LOGINAME=RTRIM(LOGINAME),
HOSTNAME,
CMD
FROM MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'TEST' AND DBID != 0
(但是,如果我们不关闭连接,就会出现泄漏)
我们的应用程序与它工作时的区别在于通过 Web 表单添加了 asp.net 路由。这也会调用数据库,但会在连接打开后再次关闭它们。
我们不确定我们还能检查什么。程序员有什么想法吗?
回答
我们通过 Query Profiler 发现了问题。这向我们展示了一个使用率很高的查询。将查询追溯到代码显示了一遍又一遍地调用数据库的无限循环。很难找到,因为循环是由机器人调用网站上不再存在的页面启动的。