是否有任何 OR 映射器提供异步方法?

Posted

技术标签:

【中文标题】是否有任何 OR 映射器提供异步方法?【英文标题】:Do any OR Mappers provide Asynchronous Methods? 【发布时间】:2010-10-04 20:23:37 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

这听起来像是过早优化的一个很好的例子......在我见过的所有“高可扩展性”的东西中,有两件事似乎是关键 - 非规范化你的数据库和缓存缓存缓存。 .. 与异步 IO 无关 这是一个简单的问题,有没有提供异步方法的 OR 映射器?是还是不是?我认为公平地说,在我的特定项目中,我处于更好的位置来确定这是否过度杀戮。 为@Orion Edwards 辩护,您说“所有 I/O 请求”,这似乎有点矫枉过正。如果有人调用您的服务并且您响应 Ok,那么您的系统崩溃您将丢失排队的 I/O。这适合您的解决方案吗? 在游戏的这个阶段,我已经通过 SqlCommand 方法异步编写了后端 DAL。 【参考方案1】:

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

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

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

【讨论】:

谢谢。程序员很擅长提供建议。有时我们只需要一个答案 这不是答案,因为它对您没有帮助。但是,唉,我不是那个有问题的人。 LLBLGen Pro 不支持异步调用,因为它创建了一种尴尬的数据访问方式,同时开发人员可以通过创建工作线程自己完成。问题依然存在:回调【参考方案2】:

听起来您缺少一些索引。

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

如果不是这样。

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

【讨论】:

缺少索引?不知道你是怎么得出这个诊断的。很想说服老板解决问题。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

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

异步数据库交互并不是什么神奇的东西,你可以把它扔到什么东西上,这样它就会变得更有响应性。异步数据库交互可以使调用者同时做其他事情。但是,如果这已经不是必需的,那么您就不需要异步数据库交互,这将使您的代码不那么复杂。

【讨论】:

总而言之:您的网络服务中不需要异步方法,因为它已经在使用一个请求不会阻塞其他请求的系统。 被阻塞的线程是可用于其他请求的少一个线程。获得足够多的线程阻塞等待 IO 和您的请求队列,队列已满,您现在返回“服务不可用”消息 是的,请求是并行发生的。但是它们共享相同的系统资源。所以我使用线程池的效率越高,系统可以处理的请求就越多 Harry,你不明白我的意思是异步方法需要回调调用者以将其结果编组回来:你将如何在 web 服务中做到这一点? I.o.w.:你想要的都是不可能的。 如果您正在构建 WCF 双工服务,则在处理请求时不应阻塞。这就是异步方法有用的原因。【参考方案5】:

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

http://foss.eepatents.com/sAsync

和 NADBAPI:

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

【讨论】:

【参考方案6】:

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

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

如果你真的不想自己编写代码,你可以使用ADO.NET Data Services,它基本上是为实体框架做的。

【讨论】:

以上是关于是否有任何 OR 映射器提供异步方法?的主要内容,如果未能解决你的问题,请参考以下文章

keycloak 客户端协议映射器(脚本映射器)将请求标头添加到令牌中

如何让 Eclipse 使用 Gradle 生成 MapStruct 映射器

有什么方法可以在JAVA中制作通用抽象映射器?

有没有办法在Scalding中指定映射器的数量?

从 akka 映射器返回未来

O/R 映射器 - 好或坏