2008-09-25 3 views
1

В службе VB.Net Windows, я в настоящее время объединяют единицы работы с:.Net Многопоточность: SQL ConnectionPool

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, это кажется чрезмерным для меня тем более, что мы имеем гораздо более крупные веб-приложения tha t получить с помощью 5-10 соединений.

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

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

+0

Сколько рабочих элементов находится в очереди на обслуживание? – Kev 2008-09-25 01:33:16

ответ

4

С MS Docs -

"Соединения объединяют в процессе, в прикладной области, в строке соединения и при интегрировании используется безопасность в Windows Identity"

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

Испытываете такие как:

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

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

+0

Нет. У меня не закончилось соединение (не по умолчанию не 25 или 100). – 2008-09-25 01:30:33

0

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

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

2

Одна из серьезных проблем с вашим кодом заключается в том, что вы не закрываете свое соединение, если 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

Хотя я вообще люблю, используя заявление, я считаю, что иногда в .NET библиотеки фактического ЗАКРЫТЬ ручки не делается до сбора мусора. Таким образом, будучи старой школой и религиозной в таких вещах, я добавляю явное закрытие в конце моего заявления использования. Это код pseduo, так как я обычно код на 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 

 Смежные вопросы

  • Нет связанных вопросов^_^