gpt4 book ai didi

c# - 运行一天左右后,Windows 服务在尝试执行查询时开始出现 OracleExceptions

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:56 25 4
gpt4 key购买 nike

我有一个在 .Net 4.0 中创建的 Windows 服务,除其他外,它需要对 Oracle 数据库做两件事。一种是运行 SELECT 查询以查看是否存在具有用户给定(通过电话 UI)ID 的记录,另一种是将新记录插入表中。

一切正常,直到服务运行了一天左右 - 这里有一定程度的随机性,有时它可以运行几天,大多数情况下它只在服务重新启动后运行 24 小时。

一旦问题出现,我就开始收到 OracleExceptions。在这个问题的末尾包含一个完整的异常(exception)。异常表明打开到服务器的套接字失败,或者它已被“我的”机器上的软件关闭。

现在,有一些迹象表明这并不是真正的网络/数据库错误。

  1. 我有一个小型控制台实用程序,它使用完全相同的库代码从服务器读取数据。如果我在服务左右抛出异常的同时运行它,它可以毫无问题地使用数据库服务器验证数据。

  2. 如果我重新启动 Windows 服务,将立即恢复正常操作。

所以在我的软件中似乎有些东西在一段时间后变得“疲倦”。现在,处理最终导致 Oracle 交互的电话调用的对象在每次调用时都会重新创建——希望那里不应该存在生命周期问题。同样,当这些对象需要与 Oracle 服务器通信时,将创建一个新的 OracleConnection 对象,并实例化一个新的 OracleCommand。这些和生成的 OracleDataReader 被关闭并显式处理(我什至停止使用 using() 模式以确保我真的在这样做)。这是代码的示例,在被简化为几乎像 child 一样的东西以确保它做它应该做的事情之后:

    public bool CheckIfIdExists(string paramValue)
{
var result = false;

var conn = new OracleConnection(_connectionString);
conn.Open();
var cmd = new OracleCommand("SQL query", conn)
{
CommandType = CommandType.Text
};
cmd.Parameters.Add("paramName", paramValue);

var rdr = cmd.ExecuteReader();
result = rdr.HasRows;

rdr.Close();
rdr.Dispose();

cmd.Dispose();

conn.Close();
conn.Dispose();

return result;
}

如您所见,我在这里没有捕捉到任何异常 - 它们在我的代码中得到进一步处理。它们发生在尝试打开连接时。

我没有了解失败原因所需的 Oracle 经验。这非常令人沮丧,因为服务重启后问题就消失了。是否有一些连接池突然干涸,因为我没有正确处理我的资源?

这是我在出现问题后尝试打开与服务器的连接时遇到的异常:

Unhandled exception occurred in HandleCall: Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Network Session: Unexpected packet read error ---> OracleInternal.Network.NetworkException (0x80004005): Network Session: Unexpected packet read error ---> System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.TTC.OraBufReader.GetDataFromNetwork()
at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int32 initialLOBFetchSize, Int64[] scnFromExecution, BindDirection[]& bindDirections, DataUnmarshaller& dataUnmarshaller)
at Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel level, OracleTraceTag tag, Exception ex)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int32 initialLOBFetchSize, Int64[] scnFromExecution, BindDirection[]& bindDirections, DataUnmarshaller& dataUnmarshaller)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int32 lobPrefetchSize, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Boolean isEFSelectStatement)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader()
[...my code beyond this point...]

我考虑过进行 Wireshark session ,看看一旦出现此问题,网络级别实际发生了什么,但目前我真的不知道我在寻找什么,或者如果我能找到一个它会告诉我什么打开套接字的连接失败。

有人知道是什么原因造成的,可以采取什么措施吗?

非常感谢任何输入!

最佳答案

您应该使用“using” block 来确保及时处理资源,即使发生异常也是如此。先试试这个,看看它是否解决了问题:

public bool CheckIfIdExists(string paramValue)
{
var result = false;

using (var conn = new OracleConnection(_connectionString))
{
conn.Open();
using (var cmd = new OracleCommand("SQL query", conn))
{
cmd.CommandType = CommandType.Text
cmd.Parameters.Add("paramName", paramValue);

using (var rdr = cmd.ExecuteReader())
{
result = rdr.HasRows;
}
}
}

return result;
}

关于c# - 运行一天左右后,Windows 服务在尝试执行查询时开始出现 OracleExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com