Какие-либо 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???
Извлечение данных в асинхронном режиме может быть выполнено различными способами. Передача его в o/r mapper создает проблемы, с которыми вам, вероятно, не захочется иметь дело, поскольку это не делает ваш код менее сложным. Основная проблема заключается в том, что у вас должен быть механизм, который уведомляется, когда выборка завершается устройством отображения o / r, поэтому вызывающий абонент уведомляется о том, что данные готовы.
Это не менее сложно, чем создавать поток самостоятельно и вызывать логику выборки o/r mapper из этого потока.
Когда вы заявляете, что хотите создать веб-сервис, который должен реагировать, вы должны понимать, что вызывающий абонент находится вне веб-сервиса и ожидает данных. Iow: если вызывающий использует веб-сервис для извлечения данных, он уже асинхронный, так как другие клиенты также смогут вызывать веб-сервис: исходный запрос вызывающего абонента обрабатывается в другом потоке, логика для извлечения данных запускается внутри этого поток, и данные затем возвращаются вызывающей стороне.
Использование асинхронных методов здесь бесполезно, так как в противном случае вызывающий должен был бы получать уведомление, когда данные готовы, что требует передачи от веб-службы к клиенту, которая требует, чтобы клиент оставался подключенным к веб-службе, пока выполняется выборка. берет в любом случае.
Асинхронное взаимодействие с БД - это не волшебство, которое вы можете бросить в что-то, чтобы оно стало более отзывчивым. Асинхронное взаимодействие с БД может заставить вызывающего пользователя делать другие вещи в то же время. Однако, если это уже не нужно, для начала вам не нужно асинхронное взаимодействие с БД, что сделает ваш код намного менее сложным.
Похоже, вам не хватает некоторых индексов.
Или вам нужно перенести дизайн базы данных на модель OLAP.
Если это не так.
- Получи больше оперативной памяти.
- Получите больше процессора.
- Разделите ваши столы.
- Создайте оболочку перед БД, которая может обрабатывать асинхронные запросы. Это будет выглядеть как очередь.
Похоже, что Nhibernate относительно легче реализовать Async, чем LinqToSQL. Смотрите это
Лично я хотел бы использовать то, что мне удобно (так как я не использовал NHibernate, я бы беспокоился о кривой обучения и потенциальных проблемах, поэтому я бы предпочел использовать что-то вроде LINQtoSQL или сделанный на заказ уровень доступа к данным) и обернул его собственный веб-сервис WCF LOB Adapter.
Если вы действительно не хотите кодировать это самостоятельно, вы можете просто использовать ADO.NET Data Services, который в основном делает это для Entity Framework.