将JDBC操作放入Actor中是否好?

14

我正在构建一个传统的Web应用程序,通过JDBC进行数据库CRUD操作。我想知道将JDBC操作放入Actor中,使其脱离当前请求处理线程是否好。我进行了一些搜索,但没有找到演示此功能的教程或示例应用程序。

那么这样做有什么利弊呢?这种异步操作是否能像NIO一样提高应用服务器(即并发处理请求)的容量?

1个回答

14
无论将JDBC访问放入演员中是否“好”,很大程度上取决于您应用程序的其余部分。今天,大多数Web应用程序都是同步的,这要归功于Servlet API,它是大多数Java(和Scala)Web框架的基础。虽然我们现在看到了支持异步servlet,但该支持尚未在所有框架中得到体现。除非您从支持异步处理的框架开始,否则您的请求处理将是同步的。至于JDBC,JDBC是同步的。现实情况下,不会有任何关于此事的处理,因为这会对修改世界上存在的无数JDBC驱动程序实现产生负担。我们可以希望,但不要抱太大期望。而且JDBC实现本身不必是线程安全的,因此在完成同一连接上的某些其他操作之前调用JDBC连接上的操作将导致未定义的行为。未定义的行为!=好。

所以我的猜测是,您不会看到与NIO相同的容量改进。

编辑:刚刚发现了 adbcj;这是一个异步数据库驱动程序API。这是一个为硕士论文编写的实验性项目,非常早期和实验性。这是一个有价值的实验,我希望它能成功。来看看吧!

但是,如果您正在构建一个基于Actor的异步系统,我非常喜欢将数据访问或存储库Actors作为对象,就像在分层OO架构中使用data accessrepository对象一样。

演员保证消息一次处理,这非常适合访问单个JDBC连接。(需要注意的是:大多数连接池默认为每个线程分配一个连接,这不适用于演员。相反,您需要确保使用每个演员的连接。事务管理也是如此。)

这使您可以将数据库视为异步远程系统,这是我们一直应该以异步方式对待它的。这也意味着您的数据访问/存储库演员的结果是futures,这些结果是可组合的。这使得更容易协调数据访问和其他异步活动。

那么,这很好吗?如果符合您系统的整体架构,那么可能是好的。它会提高容量吗?这取决于您的整个系统,但听起来是一个非常值得尝试的实验。


这是一个很棒的答案,提供的材料非常有信息量。我等了好几天,只为了得到其他伟大的想法。 - xiefei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接