OR Mappers是否提供异步方法?

时间:2009-02-01 23:40:07

标签: .net asynchronous data-access-layer or-mapper

任何.Net O / R(对象/关系)Mappers都提供开箱即用的异步方法吗?

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

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

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

但另一方面,如果O / R映射器异步方法真的只是一个混乱的黑客,增加了复杂性,我不会更好。

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

6 个答案:

答案 0 :(得分:2)

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

http://foss.eepatents.com/sAsync

和NADBAPI:

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

答案 1 :(得分:2)

我认为你弄错了。我的理解是,你的情况下的异步执行应该在架构级而不是ORM级处理,即消息队列驱动的架构。我看到的是你的webserive只会在队列中放置一条消息,并且有某种后台代理会从队列中异步处理。

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

Lee B:SQLAlchemy?你如何使用.NET ???

答案 2 :(得分:1)

以异步方式获取数据可以通过各种方式完成。将它外包给o / r mapper可以提出你可能不想处理的挑战,因为它并没有真正使你的代码变得更简单。主要问题是你必须有一个在o / r映射器完成提取时通知的机制,因此通知调用者数据准备就绪。

这并不比自己创建一个线程复杂,并从该线程调用o / r mapper的fetch逻辑。

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

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

异步数据库交互不是你可以抛出的神奇东西,因此它会变得更具响应性。异步数据库交互可以使调用者同时执行其他操作。但是,如果已经没有必要,那么您不需要开始异步数据库交互,这将使您的代码变得更加复杂。

答案 3 :(得分:1)

虽然我不确定他们是否开箱即用,但您可以使用基于模板的.NetTiers。您只需将异步部件添加到模板即可。这至少可以消除你必须维护样板代码和裸SQL查询。这个blog显示了如何向MS Enterprise库添加异步调用(如果您选择,.NetTiers可以使用)。

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

我让其他答案说明这是不是一个好主意......

答案 4 :(得分:0)

Nhibernate似乎比LinqToSQL更容易实现Async。见this

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

如果您真的不想自己编写代码,可以使用ADO.NET Data Services,这基本上与实体框架相同。

答案 5 :(得分:0)

听起来你错过了一些索引。

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

如果不是这样的话。

  1. 获取更多内存。
  2. 获取更多CPU。
  3. 对表格进行分区。
  4. 构建可以处理异步请求的数据库前面的包装器。它看起来像一个队列。