2

私は.Net 4.0で作成されたWindowsサービスを持っています。これは、とりわけOracleデータベースに対して2つのことを行う必要があります。1 つは、SELECT クエリを実行して、(テレフォニー UI を介して) ユーザーが指定した ID を持つレコードが存在するかどうかを確認することです。もう 1 つは、新しいレコードをテーブルに INSERT することです。

サービスが 1 日ほど実行されるまで、すべてがうまく機能します。ここにはある程度のランダム性があり、数日間機能することもあれば、サービスが再起動されてから 24 時間機能することもあります。

問題が発生すると、OracleExceptions が発生し始めます。この質問の最後に完全な例外が含まれています。例外は、サーバーへのソケットを開くことが失敗したか、「自分の」マシンのソフトウェアによって閉じられたことを示しています。

現在、これが実際にはネットワーク/データベース エラーではないことを示す兆候がいくつかあります。

  1. サーバーから読み取るためにまったく同じライブラリ コードを使用する小さなコンソール ユーティリティがあります。サービスが左右に例外をスローしているときにこれを実行すると、問題なくデータベース サーバーでデータを検証できます。

  2. Windows サービスを再起動すると、通常の操作がすぐに再開されます。

そのため、私のソフトウェアでは、しばらくすると何かが「疲れる」ように見えます。現在、最終的に Oracle とのやり取りにつながる電話を処理するオブジェクトは、呼び出しごとに再作成されます。うまくいけば、そこに存続期間の問題がないはずです。同様に、これらのオブジェクトが Oracle サーバーと通信する必要がある場合、新しい OracleConnection オブジェクトが作成され、新しい OracleCommand がインスタンス化されます。これらとその結果の OracleDataReader は、明示的に閉じられ、破棄されます (実際に実行していることを確認するために、using() パターンの使用をやめました)。以下はコードの例です。本来の動作を確認するために、ほぼ子供のようなものに縮小されています。

    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 セッションを実行することを検討しましたが、現時点では、何を探しているのか、または失敗した接続を見つけることができるかどうかはわかりません。ソケットを開きます。

誰がこれを引き起こす可能性があるのか​​ 、それに対して何ができるのか知っていますか?

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2