Какие-либо OR Mappers предоставляют асинхронные методы?

Любые.Net O/R (объект / реляционные) Mapper предоставляют асинхронные методы из коробки?

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

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

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

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

Пожалуйста, не сосредотачивайтесь на альтернативах асинхронному программированию.

6 ответов

Решение

Хотя я не уверен, что кто-нибудь из них сделает это из коробки, вы можете использовать .NetTiers, основанный на шаблонах. Вы можете просто добавить асинхронные части в шаблон. Это, по крайней мере, избавит вас от необходимости поддерживать шаблонный код и простые запросы SQL. В этом блоге показано, как добавить асинхронные вызовы в библиотеку MS Enterprise (которую вы можете использовать.NetTiers, если хотите).

С середины декабря 2008 года LLBLGen Pro изначально не поддерживает асинхронные вызовы. В настоящее время Геном тоже нет. Похоже, что Telerik тоже. По большей части просто искал их документацию и искал либо асинхронные, либо методы, которые начинаются с начала, потому что это шаблон.

Я позволю другим ответам говорить о том, хорошая это идея или нет...

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

Поскольку у меня недостаточно репутации, чтобы комментировать, а Stackru предупреждает меня, вставляя еще один "ответ", я оставлю свой комментарий здесь.

Ли Б: SQLAlchemy? Как вы используете его с.NET???

Да, для SQLAlchemy (один из лучших ORM) есть sAsync:

http://foss.eepatents.com/sAsync

и НАДБАПИ:

http://developer.berlios.de/projects/nadbapi/

Извлечение данных в асинхронном режиме может быть выполнено различными способами. Передача его в o/r mapper создает проблемы, с которыми вам, вероятно, не захочется иметь дело, поскольку это не делает ваш код менее сложным. Основная проблема заключается в том, что у вас должен быть механизм, который уведомляется, когда выборка завершается устройством отображения o / r, поэтому вызывающий абонент уведомляется о том, что данные готовы.

Это не менее сложно, чем создавать поток самостоятельно и вызывать логику выборки o/r mapper из этого потока.

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

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

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

Похоже, вам не хватает некоторых индексов.

Или вам нужно перенести дизайн базы данных на модель OLAP.

Если это не так.

  1. Получи больше оперативной памяти.
  2. Получите больше процессора.
  3. Разделите ваши столы.
  4. Создайте оболочку перед БД, которая может обрабатывать асинхронные запросы. Это будет выглядеть как очередь.

Похоже, что Nhibernate относительно легче реализовать Async, чем LinqToSQL. Смотрите это

Лично я хотел бы использовать то, что мне удобно (так как я не использовал NHibernate, я бы беспокоился о кривой обучения и потенциальных проблемах, поэтому я бы предпочел использовать что-то вроде LINQtoSQL или сделанный на заказ уровень доступа к данным) и обернул его собственный веб-сервис WCF LOB Adapter.

Если вы действительно не хотите кодировать это самостоятельно, вы можете просто использовать ADO.NET Data Services, который в основном делает это для Entity Framework.

Другие вопросы по тегам