2014-10-10 2 views
1

Довольно новый для разработки CLR SQL. Мне нужно использовать контекстное соединение в нескольких функциях C# в классе UserDefinedFunctions. Вопрос связан ли он или нет лучшеОбъект SQL CLR C# и SqlConnection

  1. Создание соединения контекста в функции # 1, который затем передается в функцию # 2, # 3 и т.д.
  2. Создать новое соединение контекста в каждой функции который должен запрашивать базу данных.
  3. Создайте переменную экземпляра класса и используйте ее для всех функций.
  4. Создайте функцию «запроса» и передайте ей строку запроса/параметры и выполните все запросы в одной функции. Этот вариант будет эффективно создавать и уничтожать соединение при каждом правильном вызове?
  5. Открыт для других идей.

Не знаете, что лучше всего подходит для обработки контекстного соединения, когда оно необходимо в разных местах кода.

Предпочитаете использовать using (SqlConnection connection...) {}, чтобы обеспечить правильное удаление вещей, но, возможно, также можно использовать деструктор в классе для этого?

ответ

0

Context Connection - это производственное соединение, поэтому его можно открыть только один раз. И поскольку он «in-process», SQL Server не нужно выделять новые ресурсы для подключения, как это происходит с обычным/внешним соединением, которому необходимо создать новый SPID и т. Д. (И, следовательно, почему у нас есть пул соединений для смягчения это стоимость). Следовательно, я не знаю, насколько производительность будет улучшена для всех этих усилий.

Вы могу проход, который SqlConnection объекта вниз к другим методам, но вы должны взвесить затраты/выгоды от снижения очень минимального количества накладных расходов (по сравнению с созданием нового, внешнее соединения) с тем, что вам не может передавать информацию обратно в то же время, когда контекстное соединение открыто.

Вы не хотели бы создавать переменную экземпляра, поскольку это вынуждало бы Ассамблею требовать установки с PERMISSION_SET из UNSAFE. Проблема заключается в том, что класс создается при первом вызове метода внутри него, и он остается в памяти до тех пор, пока домен приложения не будет выгружен или, возможно, какое-либо другое событие, но в любом случае он остается резидентом довольно долгое время. Класс также используется для всех пользователей, которые вызывают методы внутри него, поэтому переменная уровня класса является проблематичной, поскольку она будет использоваться совместно с SPID. Вот почему все методы должны быть static.

Вы можете использовать конструкцию using, но вы думаете о неправильных условиях, рассматривая это на уровне класса. Класс создается один раз и предоставляется всем пользователям системы.

Для получения дополнительной информации о SQLCLR, я пишу серию об этом на сервере SQL Central: Stairway to SQLCLR

+0

Спасибо. Да, мне нужно держать его БЕЗОПАСНЫМ. Так вы говорите, что варианты 1,2,4 являются жизнеспособными вариантами? И вариант 1 может не стоить этого в зависимости от того, какая работа выполняется? И я очень ценю технические подробности - теперь я лучше понимаю, что происходит за кулисами. – thomas

+0

Можете ли вы помочь мне понять «с тем фактом, что вы не можете передавать информацию обратно в то же время, что контекстное соединение открыто». Передайте данные обратно вызывающему абоненту в SQL Server или передайте данные обратно на вызывающую функцию (возврат) в C#? – thomas

+0

@thomas: Вы должны проверить, какая относительная разница для № 1. Я «думаю», что стоимость создания/уничтожения «Context Connection = true» 'SqlConnection' близка к нулю, учитывая, что вы уже привязаны к процесс SQL Server. У меня нет статистики, но SQL Server не нужно выделять новые ресурсы, как с новым соединением. Между 2 и 4 они звучат примерно так же, просто организованы по-разному. Я бы предложил сделать код работать и быть удобным/удобочитаемым. Что касается передачи данных назад, я думал о передаче TVF обратно в запрос. –

0

Если я правильно помню, вы можете открыть только одно контекстное соединение одновременно. Итак, ваш №1 - это то, как я реализовал его в прошлом.

Я создал свое контекстное соединение в моей функции ввода \ sproc, а затем передал его по течению другим методам. Функция ввода отвечала за жизненный цикл соединения.

+0

Спасибо. Это то, что я сейчас делаю.Просто подумал, что это похоже на дополнительное прохождение вокруг, что может не понадобиться. Эта функция CLR будет называться десятки миллионов раз в день, пытаясь придумать способы оптимизации как можно больше. – thomas