Многопоточность .Net: SQL ConnectionPool - PullRequest
1 голос
/ 25 сентября 2008

В службе Windows VB.Net я в настоящее время объединяю единицы работы с:

ThreadPool.QueueUserWorkItem(operation, nextQueueID)  

В каждой единице работы (или потоке, который я буду использовать для простоты понимания), он выполнит пару операций MSSQL следующим образом:

    Using sqlcmd As New SqlCommand("", New SqlConnection(ConnString))
        With sqlcmd
            .CommandType = CommandType.Text
            .CommandText = "UPDATE [some table]"

            .Parameters.Add("@ID", SqlDbType.Int).Value = msgID

            .Connection.Open()
            .ExecuteNonQuery()
            .Connection.Close()   'Found connections not closed quick enough'
        End With
    End Using

Когда я запускаю netstat -a -o на сервере, я вижу около 50 подключений к SQL-серверу на IDLE или ESTABLISHED, мне это кажется чрезмерным, особенно если учесть, что у нас гораздо большие веб-приложения, которые обходятся с 5 -10 подключений.

Строка подключения является глобальной для приложения (не изменяется), и также определена Pooling=true.

Теперь у каждого из этих потоков будет свой ConnectionPool, или есть один ConnectionPool для всего процесса .EXE?

Ответы [ 4 ]

4 голосов
/ 25 сентября 2008

Из MS Docs -

«Соединения объединяются для каждого процесса, домена приложения, строки подключения и, когда используется встроенная защита, для удостоверения Windows»

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

У вас возникают ошибки, такие как -

Сведения об исключении: System.InvalidOperationException: Истекло время ожидания. Тайм-аут период истек до получения соединения из пула. Это могло произойти потому что все пулы подключений использовались и был достигнут максимальный размер пула.

Кроме того, сколько рабочих элементов находится в очереди в службе?

2 голосов
/ 25 сентября 2008

Одна большая проблема с вашим кодом заключается в том, что вы не закрываете свое соединение, если ExecuteNonQuery выдает исключение. Недостаточно просто удалить SqlCommand, вам нужно также утилизировать SqlConnection при возникновении исключения, например:

Using SqlConnection connection = New SqlConnection(ConnString)
    Using sqlcmd As New SqlCommand("", connection)        
        With sqlcmd            
          ... etc
        End With    
    End Using
End Using
1 голос
/ 10 января 2009

Хотя мне обычно нравится выражение using, я нахожу, что иногда в библиотеках .NET фактическое ЗАКРЫТИЕ дескриптора не выполняется до сборки мусора. Таким образом, будучи старой школой и религиозным в таких вещах, я добавляю явное закрытие в конце своего заявления об использовании. Это псевдо-код, поскольку я обычно пишу на C #, а не на VB.NET, но он должен дать вам представление.

Using SqlConnection connection = New SqlConnection(ConnString)

   TRY
      Using sqlcmd As New SqlCommand("", connection)
                  With sqlcmd
                        ... etc
          End With
      End Using
   FINALLY
      connection.Close()

End Using
0 голосов
/ 25 сентября 2008

Если количество открытых соединений вас обидело, возьмите под контроль строку подключения

Примечание: MinPoolSize и MaxPoolSize.

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