Чистый способ повторить неудачные операции System.Data.SqlClient - PullRequest
3 голосов
/ 07 октября 2010

Я унаследовал довольно большую кодовую базу C #, которая сотни раз засорялась следующим способом выполнения операций с БД:

using (SqlConnection connection = new SqlConnection(connectionString)) {
    SqlCommand command = new SqlCommand(queryString, connection);
    command.Connection.Open();
    command.ExecuteNonQuery();
}

Однако из-за факторов, не зависящих от меня, сервер БД является жестоким иособенно подвержен сбоям, поэтому значительный процент этих запросов не выполняется.Учитывая, что этот конкретный способ доступа к БД разбросан повсюду в коде, как я могу кодировать повтор в одном месте и применять его везде * SqlCommand

Некоторые мысли:

  • Я попытался переопределить SqlConnection / SqlCommand ExecuteNonQuery, чтобы создать версию оболочки.Не хорошо.SqlConnection и SqlCommand являются запечатанными объектами C #.
  • Я мог бы создать контейнерный класс с именем MySqlConnection, который содержит объект .NET SqlConnection, а затем создать свой собственный ExecuteNonQuery, что в свою очередьповторите попытку SqlCommand.ExecuteNonQuery() несколько раз.Однако это не очень хорошо, потому что мне нужно было бы реализовать каждую функцию SqlCommand И научить других людей использовать мой класс-обертку вместо SqlCommand напрямую.Обучение пользователей не является приемлемым решением в этом случае, к сожалению.Я застрял с другими разработчиками, которые передаются на аутсорсинг, имеют частый оборот и никогда не слушали мои просьбы использовать новый класс SQL.
  • Как я уже говорил, у меня просто нет доступа (политически итехнически) гадить со слоем БД.Основной причиной проблемы является просто неправильная настройка SQL-сервера, но я не могу решить проблему на этом уровне.

Есть ли другой вариант, который я могу попробовать?

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Если предположить, что о битхе 2х4 и билете на самолет вашим партнерам-аутсорсерам не может быть и речи,

, возможно, вы захотите взглянуть на что-то вроде postsharp (http://www.sharpcrafters.com/), чтобы получитьаспектно-ориентированное решение. По сути, напишите некоторый код, который можно подключить к различным методам. Затем вы можете связать события в SqlCommand; распоряжение, изменение информации и состояния может дать что-то полезное, если вам повезет.

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

Удачи

0 голосов
/ 07 октября 2010

Если вы можете позволить себе накладные расходы, одним из вариантов будет написать что-то вроде «прокси БД».

Ваш код будет указывать на прокси (через строку подключения).Прокси, в свою очередь, будет указывать на фактическую базу данных (через строку подключения).Прокси-сервер будет перехватывать запросы БД, выполнять их на реальной БД и возвращать результаты.Но при этом он мог бы реализовать алгоритм, чтобы сделать запросы более надежными (путем повторных попыток и т. Д.).

Просто скажу.Это был бы способ реализовать повторные попытки без изменения кода.

0 голосов
/ 07 октября 2010

Задумывались ли вы о простом служебном методе, который делает то, что вам нужно, и становится стандартом для вызовов в БД? Разумеется, это соответствует принципам вашей обертки, однако это не допустит сопротивления со стороны оффшорной команды, поскольку им не придется использовать другой тип. Это может быть просто причиной абстрагирования работы от одного места.

Нам нужно централизовать обработку нашей БД и т. Д. ... подбросить некоторые изумительные слова руководству ... и все - иди ...

Похоже, вы могли бы снять это с политической позиции нет?

...