异步检索SQL查询执行结果。

时间:2015-06-13 21:55:10

标签: java mysql sql asynchronous jdbc

经过相当多的研究后,我决定继续写一个在堆栈溢出时似乎相当多余的问题,但我只是在问,因为我找不到答案。我已经对Java NIO2框架有了一些乐趣,它极大地提高了我的应用程序的可伸缩性。 (我们以前使用老式的I / O TPC服务器/客户端设置来安装一些人工温和的仿真服务器),让我告诉你。如果你知道我的意思,并发就是女王B.

我们正在从使用线程作为对所有事物的回答(为了更好地实践并且更熟悉推进技术)。以前我们使用平面文件存储(文本/二进制格式存储)来存储用户数据,并将所有内容迁移到SQL数据库。

在这样做时,我注意到通常没有问题,但是等待数据库永远不会有趣,而在模拟游戏环境中等待数据库调用永远不会有趣,特别是当整个游戏服务器都在等待。这是我们通常会替换线程的地方。为什么不使用Thread pool或类似的方法在另一个线程上执行SQL调用。

Java NIO2 CompletableFuture<K,V>对任何类型的异步事件都有很大的帮助,但是我一直试图找到一种方法来使用SQL调用。我认为编写我们自己的JDBC版本使用NIO2总是一个选项,但似乎有点过度杀戮,可能会花费更多的时间和金钱而不是它的价值。请记住,我们只是一个小型仿真社区,而不是大型企业,但我们确实希望确保为用户提供高质量的服务。

我正在调查jooQ这似乎没问题,但它似乎有点过分杀人。这使用了CompletableFuture#supplyAsych方法,但是可用的示例并没有真正深入地解释它。然而,它引用了这句话:

  

这种解决方案总会有一个阻挡障碍   是JDBC本身 - 很难变成异步API。   实际上,很少有数据库真正支持异步查询执行。

但是,数据库不一定需要支持异步查询执行,以便在异步上下文中提供结果。如果我的服务器没有等待(并且只等待)API来获取查询结果,那么这是唯一真正重要的事情。可以使用Unity的脚本参考中的示例来解释与此类似的活动:CoRoutines

请不要推荐Scala。

1 个答案:

答案 0 :(得分:1)

Java NIO2的级别太低,无法帮助您。

开发异步版JDBC的“思想泡沫”存在问题,原因有两个:

  • 它实际上不符合在JDBC API层之上实现事务的方式(即在应用程序代码中)。在较少数量的线程上同时处理多个事务的应用程序将变得更加复杂。更复杂(通常)意味着更不可靠,而这不是您在进行(传统)数据库操作时所需的。

  • 设计异步JDBC API是一回事,但实现它完全是另一回事。这里真正的问题是真正的工作发生在多个 JDBC驱动程序中:

    • 有些驱动程序是专有的。
    • 所有驱动程序都会向后端数据库(在JVM或网络连接中)使用某种非标准“协议”。
    • 这些协议(AFAIK)本质上是同步的,通常是专有的。
    • 使用支持异步模式的东西更新或替换协议将需要自己更改数据库实现。

那么解决方案是什么?

这个Q&amp; A有一些指向试图实现异步数据库API的项目的链接:“Is asynchronous jdbc call possible?”。

我想,如果您对此不满意(即进度或API),您可以开始自己的项目。但是,您可能会遇到同样的设计和实现问题。

另一种方法可能是完全放弃SQL和ACID,并查看一些所谓的“NoSQL”数据库,看看它们是否为您提供了所需的异步API和行为。