2016-12-20 4 views
0

Я занимаюсь этим сайтом вверх и вниз, но я не могу найти, что происходит с моим пулом соединений WebService. Используя приложение, я вызываю WebMethod на моем сервисе, который, в свою очередь, запускает код ниже.Пул соединений SQL Исключительный предел, несмотря на то, что наконец блокируют закрытие соединения

Using cn As New SqlConnection(ConnectionString) 
    Try 
     Using cmd As New SqlCommand() 
      cmd.Connection = cn 
      cmd.CommandType = CommandType.Text 
      cmd.CommandText = "select * " & 
         " from Customer " & 
         " where Customer[email protected] and active=1" 
      cmd.Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
      cmd.Parameters("@CustomerID").Value = CustomerID 
     End Using 
     da = New SqlDataAdapter(cmd) 
     da.Fill(ds, "Customer") 
    Catch ex As Exception 
     Throw ex 
    Finally 
     If cn.State = ConnectionState.Open Then 
      cn.Close() 
     End If 
    End Try 
End Using 

Тогда в моем SSMS я огнь ниже, и я могу видеть на моей БД у меня еще есть активное соединение со статусом «спящим»

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName, 
    status 
FROM 
    sys.sysprocesses 
WHERE 
    dbid = 16 'my dbid 
GROUP BY 
    dbid, loginame, status 

я прохожу над подобными методами, и мои NumberOfConnections просто продолжает строительство. помочь

DBNAME | NumberOfConnections | LoginName | Status 
MyDB | 1     | jgritten | sleeping 
+0

Вы уверены, что нет замков? – Codexer

+1

Нет никакого смысла в вашем обработчике исключений. Блок finally бесполезен, поскольку соединение не может быть открыто в этой точке, и даже если оно есть, оно будет закрыто в инструкции 'End Using'. Кроме того, ваш обработчик исключений хуже, чем никакой обработчик, потому что вы используете 'Throw ex'. Поступая таким образом, вы теряете всю информацию стека вызовов и делаете свой метод источником исключения. Если вам когда-нибудь понадобится повторное исключение, которого вы не здесь, то вам следует просто использовать «Бросок». – jmcilhinney

+0

Обработчик был там, потому что я где-то читал, если во время участка адаптера произошла ошибка, это может быть пропущено закрытие – jgritten

ответ

-1

Вы можете просто потеряли его в переводе код для Вашего поста - но нет cn.Open(). Я также хотел бы cn.Close() в инструкции Try, а затем, как только catch-all оставит закрытие в заявлении finally. Вы также можете включить check и cn.close() в оператор catch, чтобы любое исключение также закрыло соединение.

Во-вторых, ваш оператор using для sqlcommand заканчивается, прежде чем вы заполните его dataadapter. Исправьте эти вещи и прекратите существующие соединения. Проверьте свои закрытые соединения в своих транзакциях. Может быть, шаг за шагом и убедитесь, что он не тайно бросает исключения или записывает строку исключения в консоль на всякий случай, когда она пропускает.

+0

Нет необходимости вызывать 'Open' при соединении при вызове' Fill' или 'Update' на адаптере данных, поскольку они будут неявно открывать соединение. Они также неявно закрывают соединение, если они его открывают, поэтому нет необходимости вообще называть 'Close'. Тот факт, что объект соединения создается с помощью оператора 'Using', также означает, что его не нужно закрывать, потому что он будет неявно удален и закрывает его. Если вы собираетесь использовать блок «Try ... Catch», правильно закрыть соединение в блоке 'finally' и ТОЛЬКО там. – jmcilhinney

+0

Для того, чтобы квалифицироваться, вам нужно явно называть 'Open', если вы делаете несколько вызовов' Fill' или 'Update', чтобы не открывать и закрывать соединение несколько раз. Если это всего лишь один вызов, целесообразно, чтобы открытие и закрытие выполнялись неявно. – jmcilhinney

+0

А, ну, может быть, вы правы, но оба ваших комментария полностью перескакивают по второму факту, который я поднял. SQLCommand вообще не существует в этом контексте. Эта строка выведет исключение в блок catch, который все еще необработан, так как это просто бросает другое исключение, которое, вероятно, полностью удаляет его полностью из блока trycatchfinally. Дайте мне знать, что вы думаете. – pizzaslice

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