我们在

Windows 2008 SP2 / IIS 7上托管了一个访问Oracle数据库的C#WCF Web服务.通常数据访问工作正常,但在负载测试期间,它经常超时并记录和异常说:

Error occurred when processing XXXXXXXX Web Service

Oracle.DataAccess.Client.OracleException Connection request timed out at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OposqlValCtx* pOposqlValCtx,Object src,String procedure,Boolean bCheck)

at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,Object src)

at Oracle.DataAccess.Client.OracleConnection.Open()

at MyWorkspace.WorkForceDataAccess.CheckStaffIdInRSW()

at MyWorkspace.MyClass.MyFunction(MyDataType MyData)

要查询数据库,我们使用以下内容:

OracleConnection orConn = new OracleConnection();

orConn.ConnectionString = "user id=xxx; password=xxx; Connection Timeout=600; Max Pool Size=150; data source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST.MYDOMAIN.com)(PORT = 1771)) (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE.MYDOMAIN.com)))";

orConn.Open();

using (var cmd = new OracleCommand("MY_UTIL.check_StaffIdInRSW",orConn) { CommandType = CommandType.StoredProcedure })

{

cmd.Parameters.Add("P_Staff_Id",OracleDbType.Int32);

cmd.Parameters["P_Staff_Id"].Direction = ParameterDirection.Input;

cmd.Parameters["P_Staff_Id"].Value = Convert.ToInt32(MyDataObject.StaffId);

cmd.Parameters.Add("P_retvalue",OracleDbType.Int32);

cmd.Parameters["P_retvalue"].Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery(); // Execute the function

//obtain result

returnVal = int.Parse(cmd.Parameters["P_retvalue"].Value.ToString());

}

我非常确信正在调用的存储过程不会占用所有时间.这是一个非常简单的过程,可以快速检查表中是否存在P_Staff_Id并返回结果.

此外,这仅在负载测试期间发生.在正常操作期间,事情很好,但在重载期间每秒有1条消息,这会在平稳运行一段时间后发生.

作为一种解决方法,我在连接字符串中添加了“连接超时= 600;最大池大小= 150”,但这并没有解决问题.

我们在开发服务器上运行相同的应用程序,它工作正常.我们从未遇到过这个问题.

任何关于尝试什么的建议将不胜感激.看起来我的选项已经用完了.

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐