我正在开发一个遗留系统,最终用户在加载页面时报告异常。这是在 ASP.NET 2.0 和 Oracle.DataAccess 中开发的。该异常在任何登台或开发服务器中都不可重现,并且不一致(即有时有效,有些无效)。
例外情况如下:
System.OutOfMemoryException:内存不足,无法继续执行程序。在 System.Runtime.InteropServices.Marshal.AllocCoTaskMem(Int32 cb) 在 Oracle.DataAccess.Client.OracleParameter.PreBind_Char() 在 Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize) 在 Oracle.DataAccess .Client.OracleCommand.ExecuteNonQuery()
它在数据访问层的调用方式如下,去掉一些参数只是为了让流程清晰,
public void GetXXXData(UserCredentials credentials,
decimal? P_IN_ID,
string P_IN_TYPE,
out string[] P_OUT_XX_ID,
out string[] P_OUT_XX_NAME,
int? outputArrayLength)
{
if (outputArrayLength == null)
{
outputArrayLength = 3000;
}
OdacCmd cmd = null;
P_OUT_XX_ID = null;
P_OUT_XX_NAME = null;
cmd = OdacFactory.CreateCommand("PK_XX_QAS1.pr_xx_data_q", credentials);
cmd.AddParam("P_IN_ID", P_IN_ID);
cmd.AddParam("P_IN_QUAL_TYPE", P_IN_TYPE);
IDataParameter param_P_OUT_XX_ID = cmd.AddOutputParameterString("P_OUT_XX_ID",
outputArrayLength.Value);
IDataParameter param_P_OUT_XX_NAME = cmd.AddOutputParameterString("P_OUT_XX_NAME",
outputArrayLength.Value);
cmd.ExecuteNonQuery();
P_OUT_XX_ID = OdacFactory.GetStringArray(param_P_OUT_XX_ID.Value);
P_OUT_XX_NAME = OdacFactory.GetStringArray(param_P_OUT_XX_NAME.Value);
}
非常感谢您对此的任何帮助。
更新::
在 OdacCmd 中,连接配置如下
public void Dispose()
{
if (_reader != null)
{
_reader.Close();
_reader.Dispose();
_reader = null;
}
if (_ownsConnection)
{
OracleConnection connection = _cmd.Connection;
if (connection != null)
{
connection.Close();
_cmd.Connection = null;
connection.Dispose();
}
}
_cmd.Dispose();
GC.SuppressFinalize(this);
}
并在 ExecuteNonQuery 连接关闭如下,
public int ExecuteNonQuery()
{
if (_ownsConnection)
{
_cmd.Connection.Open();
}
try
{
return _cmd.ExecuteNonQuery();
}
finally
{
if (_ownsConnection)
{
_cmd.Connection.Close();
}
}
}