IIS 7.5 下部署 .net 2.0 Webservice 访问DB2数据库,大并发下报错
菜刀李 2018-04-27 01:12:42 最近被这个问题困扰的焦头烂额,测试了很多天都没处理掉
VS2010开发的.net 2.0 ASP.net WebService 部署在Server 2003 下的IIS6上,客户端用.net 2.0 WinForm 添加的Web引用调用该WebService
其中的两个方法如下:
[WebMethod]
public DataSet GetDataSet(String SQLStr)
{
using (OleDbConnection oledbcon = new OleDbConnection())
{
oledbcon.ConnectionString = " XX";//连接的是 DB2 V8.1
oledbcon.Open();
using (OleDbDataAdapter ad = new OleDbDataAdapter(SQLStr, oledbcon))
{
ad.SelectCommand.CommandTimeout = 120;
using (DataSet ds = new DataSet())
{
ad.Fill(ds, "table");
return ds;
}
}
}
}
[WebMethod]
public String GetServerTime()
{
return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
这个程序运行3年多了一直很稳定,每天100多个用户,用XP访问时速度比较快,但是使用Win7 64访问的时候很卡顿。即使访问GetServerTime这个方法也很卡,延迟5秒以上。只能从Win7客户端计算机上运行
netsh int tcp set global autotuninglevel=disable这个命令,重启后,每次访问速度都和XP下一样快了,这两三年都是这么处理的,不过有些麻烦,需要让客户端设置一下,所以决定把WebService迁移到Server 2008的IIS7.5下,迁移后,Win7直接访问果然快了,XP也一样快,问题似乎解决了,但是,更莫名起名的问题又发生了:
1、用户少的时候,程序是正常运行的,不报错
2、用户多的时候,应用程序池自动停止,事件查看器的错误信息如下:为应用程序池“VsWebServices”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“8044”。数据字段包含错误号。
于是又做了些其它测试,比如只访问GetServerTime();不报错,运行稳定
问题就出在DataSet GetDataSet(String SQLStr) 访问数据库的方法上,又做了很多实验来测试这个方法,比如,把这个方法的代码独立出来,编了一个WinForm程序,直接访问数据库,不通过Web引用,压力测试后,不报错,运行稳定。数据库驱动看来没有问题。
所以把WebService里GetDataSet方法改为连接SQLServer,压力测试后,运行稳定,看来方法本身没毛病
但是只要把访问DB2的这个方法部署在IIS7.5下,多开几个客户端,同时操作,立马报错,真是奇怪。