5

是否有任何 .Net O/R(对象/关系)映射器提供开箱即用的异步方法?

如果可能的话,我不想为异步方法编写样板

我使用 CCR 框架使用异步方法推出了自己的 DAL。CCR 基本上要求我不要阻止它的任何线程等待 IO 响应。

到目前为止,我的解决方案的好处在于它已降至最低限度。但是随着这个项目在规模和功能方面的增长,我面临着维护原始 SQL 查询和样板代码的艰巨任务。

但另一方面,如果 O/R 映射器异步方法真的只是一个杂乱无章的 hack,它会增加复杂性,我也不会好过。

请不要专注于异步编程的替代方案。

4

6 回答 6

2

是的,对于 SQLAlchemy(最好的 ORM 之一),有 sAsync:

http://foss.eepatents.com/sAsync

和 NADBAPI:

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

于 2009-03-03T12:09:15.000 回答
2

我想你弄错了。我的理解是,您的情况下的异步执行应该在架构级别而不是 ORM 级别处理,即消息队列驱动的架构。我看到的是您的网络服务器只会在队列中放置一条消息,并且有某种后台代理在队列外进行异步处理。

由于我没有足够的声誉来发表评论,并且 Stackoverflow 提醒我插入另一个“答案”,我将在这里留下我的评论。

Lee B:SQLAlchemy?你如何将它与.NET一起使用???

于 2009-03-04T11:57:58.983 回答
1

以异步方式获取数据可以通过多种方式完成。将其外包给 o/r 映射器会带来您可能不想处理的挑战,因为它并没有真正让您的代码变得不那么复杂。主要问题是您必须有一种机制,当 o/r 映射器完成获取时通知该机制,以便通知调用者数据已准备好。

这并不比自己创建一个线程并从该线程调用 o/r 映射器的 fetch 逻辑简单。

当您声明要创建一个应该响应的 Web 服务时,您必须意识到调用者在 Web 服务之外并等待数据。Iow:如果调用者使用 web 服务来获取数据,它已经是异步的,因为其他客户端仍然可以调用 web 服务:原始调用者的请求在不同的线程上处理,获取数据的逻辑在其中运行线程,然后将数据返回给调用者。

在这里使用异步方法是没有用的,否则当数据准备好时必须通知调用者,这需要从 web 服务推送到客户端,这需要客户端保持与 web 服务的连接,只要获取无论如何都需要。

异步数据库交互并不是您可以扔给某物的神奇事物,因此它会变得更加响应。异步数据库交互可以使调用者同时做其他事情。但是,如果这已经不是必需的,那么您就不需要异步数据库交互,这将使您的代码变得不那么复杂。

于 2009-03-04T11:52:07.187 回答
1

虽然我不确定他们中是否有人开箱即用,但您可以使用基于模板的.NetTiers。您可以将异步部分添加到模板中。这至少可以消除您维护样板代码和裸 SQL 查询的麻烦。此博客展示了如何将异步调用添加到 MS Enterprise 库(如果您选择,.NetTiers 可以使用)。

截至 2008 年 12 月中旬,LLBLGen Pro 本身不支持异步调用。目前基因组也没有。Telerik似乎也没有这样做。几乎只是搜索了他们的文档并寻找 async 或以 begin 开头的方法,因为这是模式。

我让其他答案来说明这是否是个好主意...

于 2009-03-05T22:43:47.910 回答
0

Nhibernate似乎比 LinqToSQL 更容易实现 Async。看到这个

就个人而言,我会做的是使用我喜欢的东西(因为我没有使用 NHibernate,我会担心学习曲线和潜在问题,所以我宁愿使用 LINQtoSQL 或定制数据访问层之类的东西)并将其包装在它的自己的WCF LOB Adapter Web 服务。

如果您真的不想自己编写代码,您可以只使用ADO.NET 数据服务,它基本上为实体框架执行此操作。

于 2009-03-03T12:05:00.847 回答
0

听起来您缺少一些索引。

或者您需要将数据库设计转移到 OLAP 模型。

如果不是这样。

  1. 获得更多的内存。
  2. 获得更多的 CPU。
  3. 对表进行分区。
  4. 在数据库前面构建一个可以处理异步请求的包装器。它看起来像一个队列。
于 2009-03-05T21:23:56.243 回答