2015-03-22 2 views
1

Я использую sqlite в C#. Чтобы проверить производительность при больших размерах базы данных, я пишу программу для генерации случайных данных, у которых закончилась нехватка памяти. я обнаружил, что создал новый IDbCommand экземпляр сУтечка памяти в SQLite для C#?

IDbCommand cmd = dbConnection.CreateCommand() ; 

метода для каждой новой вставки, и это где утечка памяти. И если я назову `

cmd.Dispose();` 

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

Это моя обязанность называть cmd.Dispose() или это ошибка sqlite-net?

+0

Почему бы не использовать подготовленную параметризованную команду и использовать ее в цикле? Это будет более эффективным. – Tarik

+0

Даже с помощью подготовленной команды мне все равно нужно создать новую команду для каждого экземпляра верхнего уровня. Я хочу знать, есть ли риск утечки памяти. – iuradz

ответ

2

Рекомендуется использовать все, что реализует IDisposable.

Вы можете использовать using заявление, чтобы сделать это:

using (IDbCommand cmd = dbConnection.CreateCommand()) 
{ 
    // Your code here 
} 

Пожалуйста, обратите внимание, что cmd выходит за рамки за пределами блока в using заявление. Оператор using располагает вашим IDisposable, когда выполнение выходит из этого блока. Он также располагает всем в случае исключения.

+0

Что делать, если у меня есть класс, в котором есть член команды? Кажется, что Connection также реализует IDisposable. Где лучшее место для их размещения? – iuradz

+0

Как правило, вы должны располагать объекты, как только вы закончите с ним. Поэтому избавьте его, когда вы закончите использовать его. Не уверен, что вы спрашиваете о наличии члена типа IDbCommand. Вы просто объявляете это нормально и завершаете инициализацию в инструкции 'using'. Когда он выходит из сферы действия, его обнародованные ресурсы освобождаются, и это означает, что он не ссылается на созданную вами команду. Использование его после использования блока, но без его инициализации снова вызовет исключение. – matteeyah

+0

Например, у меня есть класс, который имеет переменную-член IDbCommand. Чтобы повысить эффективность, я подготовил его в конструкторе, как сказал @Tarik. Когда экземпляр класса больше не используется, я думаю, что я должен распорядиться этой командой. Должен ли я реализовать IDisposable и Dispose для команды, или если я могу использовать ее в методе Finalize? Мне жаль моего бедного английского. – iuradz