Как безопасно создать соединение с ядром oracle и asp.net? - PullRequest
0 голосов
/ 29 октября 2019

В ASP.NET Core 2.2, Dapper Oracle 1.0.1 и управляемых драйверах Oracle ODP 2.19.50 Использование следующего кода для выдачи простого запроса на чтение. Приведенный ниже код вызывается, возможно, ~ 10 раз в минуту различными потребителями API.

// connectionString = Data Source=thehost:1521/blah;User Id=bob;Password=bob
using (IDbConnection dbConnection = new OracleConnection(this.connectionString))
{
    dbConnection.Open();
    var results = dbConnection.Query<MyDBModelClass>(myQuery);
    return results;
}

В большинстве случаев вышеприведенный код работает нормально, но получаются, по-видимому, случайные исключения .NET, подобные приведенному ниже.

SocketException: попытка подключения не удалась, так как подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, так как подключенный хост не смог ответить

OracleInternal.Network. ReaderStream.Read (OB OraBuf) NetworkException: ORA-12570: Сетевой сеанс: непредвиденная ошибка чтения пакета

OracleInternal.Network.ReaderStream.Read (OB OraBuf) OracleException:

ORA-12570: СетьСессия: непредвиденная ошибка чтения пакета* Существует множество исключений, регистрируемых из драйвера, которые встречаются в этих чанках:

(PRI) (EXT) Connection.connect()
(PRI) (ONS) (EXT) Connection.connect()
(PRI) (ONS) (EXT) ReceiverThread.establishConnection()
(PRI) (ONS) (ENT) Concurrency.setListFailed()
(PRI) (ONS) (EXT) Concurrency.setListFailed()
(PRI) (ONS) (ENT) ONS.nodeListFailOver()
(PRI) (ONS) (EXT) ONS.nodeListFailOver()
(PRI) (ONS) (ENT) ReceiverThread.establishConnection()
(PRI) (ONS) (ENT) Connection.connect()
(PRI) (ENT) Connection.connect()
(PRI) (ONS) (ERR) Connection.connect() (txnid=n/a) System.IO.IOException: The operation is not allowed on non-connected sockets.
   at System.Net.Sockets.NetworkStream..ctor(Socket socket, FileAccess access, Boolean ownsSocket)
   at OracleInternal.NotificationServices.Connection.connect()

Вышеуказанное исключение заставило меня поверить, что я, возможно, не создавал / удалял / и т.д. соединение правильно, так как похоже, что оно пытается прочитать из закрытого соединения?

Есть ли что-то в приведенном выше коде, что, очевидно, вызывает это?

1 Ответ

0 голосов
/ 07 ноября 2019

Это исправило случайные ошибки, которые происходили. Не уверен, почему, хотя. Обновите строку подключения, указав время ожидания, например ;Connection Timeout=600

...