把jdbc操作放在actor中好不好?

2024-01-06

我正在构建一个传统的 Web 应用程序,通过 JDBC 执行数据库 CRUD 操作。我想知道将 jdbc 操作放入当前请求处理线程之外的参与者中是否合适。我做了一些搜索,但没有找到演示此功能的教程或示例应用程序。

那么有哪些缺点和优点呢?这种异步会像 nio 一样提高应用程序服务器的容量(即处理的并发请求)吗?


将 JDBC 访问放入 actor 中是否“好”很大程度上取决于应用程序的其余部分。

如今大多数 Web 应用程序都是同步的,这要归功于服务程序接口 http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServlet.html它是大多数 Java(和 Scala)Web 框架的基础。虽然我们现在看到支持异步 Servlet http://wiki.eclipse.org/Jetty/Feature/Continuations,这种支持并没有在所有框架上发挥作用。除非你开始于支持异步处理的框架 https://github.com/spray/spray/wiki,您的请求处理将是同步的。

至于 JDBC,JDBC 是同步的 https://stackoverflow.com/q/4087696/115478。实际上,考虑到修改世界上无数的 JDBC 驱动程序实现所带来的负担,永远不会对此采取任何措施。我们可以抱有希望,但不要屏住呼吸。

而且 JDBC 实现本身不必是线程安全的,因此在同一连接上完成某些其他操作之前调用 JDBC 连接上的操作将导致未定义的行为。未定义的行为!=好。

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

Edit: 刚刚发现adbcj http://code.google.com/p/adbcj/;异步数据库驱动程序 API。这是一个为硕士论文写的实验项目,很早,实验性的。这是一个值得尝试的尝试,我希望它能成功。一探究竟!

But,如果您正在构建一个异步的、基于参与者的系统,我真的很喜欢拥有数据访问或存储库参与者的想法,就像您拥有的方式一样数据访问 http://static.springsource.org/spring/docs/3.0.x/reference/html/jdbc.html or 存储库 http://debasishg.blogspot.com/2007/02/domain-driven-design-inject.html分层 OO 架构中的对象。

Actor 保证一次处理一条消息,这对于访问单个 JDBC 连接来说是理想的选择。 (需要注意的是:大多数连接池默认分配每个线程的连接,这对于参与者来说效果不佳。相反,您需要确保使用的是每个参与者的连接。同样如此用于事务管理。)

这使您可以像对待异步远程系统一样对待数据库,而我们应该一直将其视为异步远程系统。这也意味着您的数据访问/存储库参与者的结果是futures http://doc.akka.io/docs/akka/current/scala/futures.html, 哪个是可组合的 http://doc.akka.io/docs/akka/current/scala/futures.html#Composing_Futures。这使得协调数据访问与其他异步活动变得更加容易。

So, 好吗?可能是这样,如果它适合系统其余部分的架构。会提高能力吗?这将取决于您的整个系统,但这听起来是一个非常值得的实验。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

把jdbc操作放在actor中好不好? 的相关文章

  • Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

    我正在尝试使用 scalaz iteratee 包在恒定空间中处理大型 zip 文件 我需要对 zip 文件中的每个文件执行一个长时间运行的进程 这些进程可以 并且应该 并行运行 我创建了一个EnumeratorT使每个膨胀ZipEntry
  • 如何从 Scala repl 中取消导入隐式?

    是否可以从 repl 中取消导入隐式内容 说我做这样的事情 scala gt import scala math BigInt import scala math BigInt scala gt implicits 2 implicit m
  • Liftweb 环境中的后台任务

    我必须编写守护进程 并且我想使用模型来连接到数据库和一些有用的 Lift 类 是否可以运行 Rails 的 rake 任务的模拟 Scala 社区组上也有类似的问题 答案是使用Actors来做后台处理
  • 将 java.util.logging 与 HyperSQL 数据库引擎的 JDBC 驱动程序结合使用

    在寻找我的问题的答案后在 Java 应用程序中实现日志记录 https stackoverflow com questions 12343600 implementing logging in a java application and
  • Scala:如何编写将类型化为接收者的实现类型的对象返回的方法

    我知道 Scala 中不推荐使用案例类继承 但为了简单起见 我在以下示例中使用了它 scala gt case class Foo val f String def foo g String Foo this copy f g define
  • 重塑案例类构造函数?

    试图找到一种方法来 重塑 案例构造函数以填充某些默认值 以下情况可能吗 def reshape T R1 lt HList R2 lt HList h R1 R2 gt T example case class MyClass a Doub
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum
  • com.mysql.jdbc.Driver 的类未找到异常不是类路径问题

    我已经为此工作了几个星期 但现在我只是在原地踏步 我收到运行时错误 在获取连接 com mysql jdbc Driver 时 在 class 中未找到类异常 连接函数如下 return a MySQL connection to the
  • 最小重复子串

    我正在看 Perl代码高尔夫页面 http www perlmonks org node id 82878 不要问为什么 并遇到了这个 第 3 洞 最小重复图案 编写一个子例程 它接受一个字符串 该字符串可能包含 重复模式 并返回最小的重复
  • 如何从 SparkSQL DataFrame 中的 MapType 列获取键和值

    我的镶木地板文件中有数据 该文件有 2 个字段 object id String and alpha Map lt gt 它被读入 SparkSQL 中的数据帧 其架构如下所示 scala gt alphaDF printSchema ro
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer
  • 不支持的身份验证令牌,仅当禁用身份验证时才允许 schema='none':{ schema='none' } - Neo4j 身份验证错误

    我正在尝试使用 neo4j spark connector 从 Spark 连接到 Neo4j 当我尝试连接到 Neo4j 时遇到身份验证问题org neo4j driver v1 exceptions AuthenticationExce
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 错误:协变类型 A 出现在逆变位置

    我试图写一个不可变的Matrix A 班级 我希望该类是协变的A但是当我把 在 前面A编译器开始抱怨类中的某些操作 以下是我的相关子集Matrix类 实际类比以下子集大 5 倍左右 class Matrix A private val co
  • Spark Scala 将列从一个数据帧复制到另一个数据帧

    我有一个原始数据框的修改版本 我在其上进行了聚类 现在我想将预测列恢复为原始 DF 索引没问题 因此匹配 我该怎么做 使用这段代码我得到一个错误 println Predicted dfWithOutput show println Ori
  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将

随机推荐