Объект подключения Oracle Managed DataAccess поддерживает соединение открытым - PullRequest
0 голосов
/ 26 января 2019

Я использую Oracle.ManagedDataAccess Версия пакета Nuget 18.3.0. Я перепробовал много вещей. Я пытался избавиться от всего, что мог придумать, даже от параметров оракула. И завернул все в блок using, но безрезультатно. Единственное, что на самом деле сработало для меня - это строка комментария OracleConnection.ClearPool(oracle);. Это ошибка или какая-то проблема, связанная с конфигурацией, или я здесь неправильно понимаю? Кроме того, я попытался удалить ссылку Oracle.ManagedDataAccess и заменил ее ссылкой на System.Data.OracleClient, и это действительно сработало для меня. Он автоматически закрыл соединение, поэтому соединение со статусом «In-Active» не осталось. Приведенный ниже код переместил его в простое приложение Windows Forms, состоящее из одной кнопки, чтобы на 100% убедиться, что ничто не мешает, и проблема все еще возникает.

using (var oracle = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=SomePortHere))(CONNECT_DATA=(SERVER=SHARED)(SERVICE_NAME=anotherHost)))", new OracleCredential(userName,password)))
                {
                    oracle.Open();
                    using (var command = new OracleCommand())
                    {
                        var query = "SELECT x from y where z=:param1";
                        command.Connection = oracle;
                        command.CommandText = query;
                        command.CommandType = System.Data.CommandType.Text;
                        var param1 = new OracleParameter(":param1", xyz);
                        command.Parameters.Add(param1);
                        using (var reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                            {
                                //read the data from the reader
                            }
                        }
                        param1.Dispose();
                    }
                    //If this line is commented, there will be a connection left open, with InActive status
                    //OracleConnection.ClearPool(oracle);
                }
                password.Dispose();
                return myData;

А это изображение, показывающее открытое соединение через Toad.
Oracle Connection issue Конечно, при каждом нажатии этой кнопки будет выполняться приведенный выше код, и новый сеанс будет оставаться открытым до тех пор, пока вы не увидите изображение. Имя «TheTesterOfAllTests.exe» - это приложение Windows Forms.
Это проблема конфигурации? Есть ли способ решить эту проблему, кроме использования ClearPool метода? Потому что это влияет на производительность приложения.
P.S. Приложение, которое изначально использует приведенный выше код, - это WCF Service, которое используется веб-приложением.
P.S. 2 Существует какая-то утечка памяти, с каждым нажатием этой кнопки увеличивается использование памяти

1 Ответ

0 голосов
/ 29 января 2019

Оказывается, проблема в том, как внутренний оракул создает соединение, поскольку для каждого вновь созданного объекта OracleConnection новое соединение добавляется в пул соединений.Я насчитал 91 запись соединения в пуле соединений.Решение состояло в том, чтобы использовать один экземпляр OracleConnection для каждого запроса "На объем запроса".Я реализовал это, используя простой общий IDatabase<TConnection> интерфейс с одним TConnection GetConnection<TConnection>() методом и, конечно, для каждого метода, который будет вызываться в том же экземпляре запроса, будет происходить пара вызовов Open / Close, поэтому мы несвязь открыта все время.Что касается утечки памяти, я все еще не могу 100% подтвердить это, но когда я использовал библиотеку Oracle.DataAccess.Client вместо Oracle.ManagedDataAccess, использование памяти резко сократилось.Итак, я переключился обратно на Oracle.DataAccess.Client. PS Я буду обновлять этот ответ в случае получения новой информации об этих двух проблемах, и вклады очень приветствуются, может быть, я что-то неправильно понимаю относительно того, как Oracle работает с подключением к базе данных.

...