Найди утечку памяти? - PullRequest
       1

Найди утечку памяти?

0 голосов
/ 27 октября 2011

Проще говоря, мой sqlservr.exe вызывает утечку памяти, когда мой сервис использует его.Вопрос в том, где и почему!: (

Я инициализирую свое соединение как нули. У меня есть предложение finally, чтобы убедиться, что они закрыты ... (я также попытался .dispose на устройстве чтения данных, но это не помогает).

IЯ пытался определить проблему в течение дня. Все, что я могу сказать, это то, что она где-то здесь.

private Int32 GetCount(String From, String Where)
{

    //Build SQL string from given parameters.
    String sql = "SET dateformat DMY SELECT COUNT(*) as Count FROM " + From + " WHERE " + Where;
    SqlDataReader dataCount = null;
    SqlCommand sqlCommCount = null;
    SqlConnection sqlConCount = null;
    try
    {
        sqlCommCount = new SqlCommand();
        sqlConCount = new SqlConnection();
        sqlCommCount.Connection = sqlConCount;
        sqlConCount.ConnectionString = "connectionstring";
        sqlCommCount.CommandText = sql;
        sqlConCount.Open();

        dataCount = sqlCommCount.ExecuteReader();
        while (dataCount.Read())
        {
            return Convert.ToInt32(dataCount["Count"]);
        }
        return 0;
    }
    finally
    {
        sqlConCount.Close();
        sqlCommCount.Dispose();
        if (dataCount != null)
            dataCount.Close();

    }
}

решено:

  1. Нет утечки.

  2. Я ненавижу Sqlserver за то, что он не говорит мне, что он кеширует память, которая не используется, когда соединения сделаны, поэтому просто увеличивается и увеличивается (пока это не нужно).

Ответы [ 4 ]

2 голосов
/ 27 октября 2011

Рефакторинг вашего кода с помощью этого ключевого слова: с использованием

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

После просмотра комментария проблема, похоже, не в вашем коде C #(также, если вы используете ключевое слово using, это хорошая идея!), если есть проблема ...

SQL Server будет увеличивать занятость памяти до тех пор, пока у нее не будет свободной памяти, он будет работать таким образом.В вашем примере каждый раз, когда вы передаете новое предложение where, оно будет кэшировать оператор SQL, поэтому использование памяти будет увеличиваться до тех пор, пока у вас не будет свободной памяти.

В этом случае я предлагаю вам реорганизовать ваш код, чтобы использовать хотя бы SQLпараметры для создания предложения where, поэтому SQL всегда будет оставаться неизменным, и меняются только параметры, таким образом SQL-сервер будет кэшировать только один оператор SQL, а не тысячи.Еще лучше создать хранимую процедуру, но обычно параметров достаточно.

Имейте также в виду, что способ построения оператора SQL действительно небезопасен и может привести к атакам с использованием SQL-инъекций, использование параметров исправитэто тоже.

С уважением

Массимо

0 голосов
/ 27 октября 2011

Я думаю, string + string вызывает утечку, в StringBuilder.также вы не утилизируете SqlConCount и dataCount (вы можете попытаться изменить код, используя using

0 голосов
/ 27 октября 2011

Похоже, вы возвращаете свое целое число, прежде чем, наконец, у блока есть шанс выстрелить. Попробуйте назначить его в блоке try и вернуть после блока finally

int value = o;
try
{
  ... 
  value = Convert.ToInt32(dataCount["Count"]);
}
finally
{
//close connection
}
return value;
0 голосов
/ 27 октября 2011

ваше соединение sqlConCount никогда не утилизируется.

Утилизация реализации SqlConnection закрывает соединение перед утилизацией. поэтому лучше всего использовать для подключения команду using, и вы можете быть уверены, что проблема не в этом.

но поскольку вы не сохраняете ссылку, она все равно должна собираться мусором, так что на самом деле это не проблема. Вы на 100% уверены, что здесь утечка памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...