2012-01-09 2 views
0

Я сделал класс для DB связи, как это:.NET SQL Connection Течь

public class DbHelper : IDisposable 
{ 
private bool disposed; 
public DbHelper() 
{ 
    disposed = false; 
} 

public static SqlConnection ConnectionSender() 
{ 
    var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbname"].ConnectionString); 
    return conn; 
} 

public System.Int32 ExecuteNonQuerySender(SqlCommand cmd) 
{ 
    System.Int32 result; 
    using (var conn = ConnectionSender()) 
    { 
     conn.Open(); 

     cmd.Connection = conn; 

     result = cmd.ExecuteNonQuery(); 
    } 
    return result; 
} 

~DbHelper() 
{ 
    Dispose(false); 
} 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected virtual void Dispose(bool disposing) 
{ 
    if (!disposed) 
    { 
     if (disposing) 
     { 
     } 
    } 
    disposed = true; 
} 
} 

Я называю этот класс using метод:

var cmdParent = new SqlCommand { CommandText = sqlQuery }; 
using (var helper = new DbHelper()) 
{ 
      dt = helper.ExecuteNonQuerySender(cmdParent); 
} 

Это прекрасно работает, но мой сервер перегружен, и я подозреваю, о утечке БД. Объекты соединения DB должны быть закрыты и удалены в этом коде. Я сделал что-то не так? (программно) Я знаю, что есть также профессиональные способы решения соединения с БД, но я хочу попробовать этот код.

+0

Вы должны использовать только класс деструкторов при отключении распределения неуправляемых ресурсов Почему вы используете один здесь и вы * уверены * это соединение, которое протекает – Amy

+0

Почему DbHelper IDisposable, если вы ничего не делаете в методе Dispose? –

+0

Вы уверены, что его не что-то на сервере, такое как многочисленные строки, требуют индексирования, огромного количества одновременного запроса, плохой конфигурации? Все, что отправил код, выглядят отлично. не ссылайтесь ни на что. –

ответ

4

Прежде всего, похоже, что вы не дали нам весь класс DbHelper. Вы не показываете метод DataTableSender, но используете его в своем примере.

Во-вторых, если предположить, что в остальной части DBHelper нет ничего неожиданного, ничто в этом классе не нуждается в какой-либо логике удаления. Вы можете полностью удалить реализацию IDisposable, а также финализатор, метод Dispose и переменную disposed, и это не будет иметь никакого значения (кроме того, что вы можете удалить предложения использования при использовании класса). Я бы рекомендовал сделать это и сделать класс статическим классом (требуется также статический метод ExecuteNonQuerySender).

И, наконец, здесь нет ничего, что может вызвать утечку соединений, однако вызывающие абоненты могут быть «утечками», если они звонят ConnectionSender и никогда не закрывают/не удаляют соединение, которое они получают.

+0

Мне интересно, что использование статического класса для соединения с БД является нереальным способом или нет. Я использую класс для веб-сайта. – pilavust

+1

Вы создаете вспомогательный класс, а не класс для самого соединителя. Пока вы не держите вещи в статических переменных, статический класс не будет проблемой. – Amy

+0

На самом деле я создаю соединения в классе согласно SqlCommand. I класс использует дважды в то же время, какая команда будет использоваться? – pilavust

1

Выполните эту статью, чтобы решить ваши проблемы негерметичность: http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

+0

Просьба предоставить дополнительную информацию, а затем ссылку из статьи с 2004 года. В будущем, как и многие статьи на веб-сайте Microsoft, она может быть перемещена и не перенаправлена. –

-3

Вы не должны использовать «используя» на SQLConnection, то отчуждать заставит ваше соединение, чтобы удалить из пула соединений и может повредить производительности

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/b3587ccc-74e0-4575-9b60-7c529d2607ac

+0

Это не то, что говорится в статье. Он просто говорит, что вызов Close позволяет вам снова открыть соединение, а Dispose - нет. Он вообще не упоминает бассейн. Фактически, в дальнейшем вы обнаружите, что «P.S. Disposing DB connections по умолчанию вернет их в пул, чтобы их можно было повторно использовать. Это необычная реализация Dispose, поскольку она фактически не освобождает ресурсы». –

+0

Он не удаляет соединение из пула. – Amy

+0

Научитесь читать ребята: «Dispose закрывает соединение, но не позволяет повторно использовать один и тот же экземпляр подключения». Это от MS dev, который пишет код для BCL. Кто-то еще также отвечает за подтверждение этого утверждения через отражатель. – Bengie

3

David M. Kean - MS Dev на базе библиотеки Team Класс: "Исключением является SqlConnection и др Закрыть не означает то же самое, как Dispose Закрыть закрывает соединение, но позволяет. повторно использовать тот же экземпляр соединения позже, вызвав Open Dispose закрывает соединение, но не позволяет повторно использовать то же самое соединение экземпляр «

Стивен Клири:».., глядя на SqlConnection в рефлектор, Close и Dispose не являются таких же "

Стивен Клири:« Я умный парень (ИМО), но Дэвид работает в Microsoft. Доступ к источнику превосходит все другие знания. ;.?)»

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/b3587ccc-74e0-4575-9b60-7c529d2607ac