equelna Ответов: 2

Многие соединения открываются в SQL server


Привет, у меня есть библиотека, написанная на C#, которая позволяет мне получить доступ к sql server, эта библиотека предоставляет различные свойства и методы для ее использования. Библиотека была реализована (переписана), начиная с библиотеки COM-EXE, которая делает то же самое, что и написанная в VB6.
Я заметил, что на сервере sql оставались активными многие соединения, даже несколько дней назад, даже если в конце использования библиотеки, процессы, которые ее используют, были обнулены.

Где я делаю что-то не так? Я боюсь, что все эти бесполезные соединения могут только снизить производительность sql server.

Что я уже пробовал:

Я также реализовал интерфейс IDisposable в библиотеке, чтобы установить все объекты, объявленные частными, равными нулю, но без изменения результата.

Jochen Arndt

На этот вопрос нельзя ответить, не увидев кода.

Убедитесь, что все соединения закрыты, когда они больше не используются. Это можно сделать, вызвав либо Close() , либо Dispose (), либо с помощью блока Using.

2 Ответов

Рейтинг:
1

OriginalGriff

Установка значения NULL не утилизирует объект - она просто удаляет ссылку из использования, что позволяет сборщику мусора очищать его при запуске, что обычно происходит только тогда, когда память в системе начинает истощаться. В результате, если вы явно не закроете (и не избавитесь) свои экземпляры SqlConnection (и SqlCommand), они останутся активными, вероятно, до тех пор, пока ваше приложение не закроется.

Лучший способ справиться с этим-использовать using блоки:

using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT Id, description FROM myTable", con))
        {
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
                {
                int id = (int) reader["Id"];
                string desc = (string) reader["description"];
                Console.WriteLine("ID: {0}\n    {1}", id, desc);
                }
            }
        }
    }
Это гарантирует, что каждый объект будет автоматически закрыт и удален, когда он выйдет за пределы области видимости.


Рейтинг:
0

F-ES Sitecore

Это просто пул соединений. Создание соединений обходится дорого, поэтому, когда ваше приложение закрывает соединение, оно на самом деле не закрывается, а просто помещается в пул для повторного использования, так что в следующий раз, когда соединение будет открыто, оно получит его из пула, если оно доступно, а когда закрыто, оно будет помещено обратно в пул. Таким образом, вашему приложению не придется беспокоиться о создании\закрытии соединений. Так что вместо того, чтобы быть плохим для производительности, это на самом деле хорошо для производительности, и вам не о чем беспокоиться.