Как вы управляете подключениями к базе данных и транзакциями при вставках объектно-ориентированным способом, используя VB.net или C#?

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

В текущем проекте я повторяю, копирую и вставляю код вставки сервера sql и переношу его в классы со свойствами, методами и т. д.

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

В процедурном порядке я использовал транзакцию ADO.net для записи в одну таблицу, а затем на основе вставленного идентификатора записи записывал дополнительную информацию в другую таблицу, не закрывая соединение до тех пор, пока не будет выполнено второе задание. Я использую транзакцию, поэтому, если более поздняя вставка не удалась, первую вставку можно отменить, а с помощью try, catch, наконец, закрыть соединение, независимо от того, успешно оно или нет.

Как вы справляетесь с этим в объектно-ориентированном мире?

РЕДАКТИРОВАТЬ: Спасибо всем за ответы. Я понимаю. Вот еще один вопрос, который также помог мне прояснить его: ASP.NET/ADO.NET: обработка множества подключений к базе данных внутри объекта .NET?


person codethrift    schedule 16.04.2009    source источник


Ответы (2)


Хм, не сильно отличается.

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

Транзакции должны инициироваться и обрабатываться другим объектом. Какой-то "Менеджер". Этот класс запускает, фиксирует и откатывает транзакции.
Вы будете использовать этот менеджер в своем Приложении, например, в своей форме.
Для меня это единственный правильный способ обработки транзакций, так как ваше приложение знает ' контекст». Ваше приложение знает, сколько циклов вам придется сделать с БД, приложение знает, как долго должна длиться транзакция. Ваши объекты этого не знают.

person Frederik Gheysels    schedule 16.04.2009
comment
Ваше предположение верно... классы и экземпляры классов, представляющие элементы в бизнес-домене)... как выглядит класс менеджера? - person codethrift; 16.04.2009
comment
И... если я не использую транзакции sql, я предполагаю, что класс менеджера должен обрабатывать удаление вновь созданной вставки 1-го уровня, если вставка 2-го уровня не удалась? - person codethrift; 16.04.2009
comment
Хм, я не думаю, что зашел бы так далеко... Это ответственность программиста/пользователя имхо. В моей ситуации мой «менеджер» — это просто оболочка вокруг объекта NHibernate ISession, который имеет методы StartTransaction/Commit и т. д.. - person Frederik Gheysels; 16.04.2009

Что касается управления соединениями, не делайте этого. .Net будет хранить их для вас и эффективно перерабатывать. Попытка переработать их самостоятельно на самом деле снизит производительность.

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

person Neil N    schedule 16.04.2009
comment
Это немного близорукая точка зрения. Если вы отключите пул соединений, вы сможете управлять своими соединениями более эффективным и надежным способом, это просто вводит дополнительные затраты в ваш код (на некотором уровне), чтобы позаботиться об этом. - person Adam Robinson; 16.04.2009