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

Java 异步检索SQL查询执行结果。,java,mysql,sql,asynchronous,jdbc,Java,Mysql,Sql,Asynchronous,Jdbc,经过一番研究之后,我决定继续写一个关于堆栈溢出的问题,这个问题在这里似乎是多余的,但我之所以问这个问题,是因为我没有找到答案。Java NIO2框架极大地提高了我的应用程序的可伸缩性,我从中得到了一些乐趣。(我们以前使用老式的I/O TPC服务器/客户机设置,用于一些人口较少的仿真服务器),让我告诉您。如果你明白我的意思,并发就是女王B 我们正在从使用线程作为解决一切问题的方法(尝试更好的实践并更加熟悉先进的技术)。以前,我们对用户数据使用平面文件存储(文本/二进制格式存储),并已将所有内容迁移

经过一番研究之后,我决定继续写一个关于堆栈溢出的问题,这个问题在这里似乎是多余的,但我之所以问这个问题,是因为我没有找到答案。Java NIO2框架极大地提高了我的应用程序的可伸缩性,我从中得到了一些乐趣。(我们以前使用老式的I/O TPC服务器/客户机设置,用于一些人口较少的仿真服务器),让我告诉您。如果你明白我的意思,并发就是女王B

我们正在从使用线程作为解决一切问题的方法(尝试更好的实践并更加熟悉先进的技术)。以前,我们对用户数据使用平面文件存储(文本/二进制格式存储),并已将所有内容迁移到SQL数据库

在进行此操作时,我注意到通常没有问题,但是等待数据库从来都不是一件有趣的事情,在模拟游戏环境中,等待数据库调用从来都不是一件有趣的事情,尤其是当整个游戏服务器都在等待时。这是我们通常替代线程的地方。为什么不使用
线程池
或类似工具在另一个线程上执行SQL调用呢

Java NIO2
CompletableFuture
对于任何类型的异步事件都有很大的帮助,但是我一直在试图找到一种方法将其用于SQL调用。我认为编写我们自己的使用NIO2的JDBC版本始终是一种选择,但这似乎有点过头了,可能需要更多的时间和金钱。请记住,我们只是一个小型仿真社区,不是大型企业,但我们确实希望确保为用户提供高质量的服务

我正在研究jooQ,这似乎没什么问题,但也有点过头了。这使用了
CompletableFuture#supplyAsych
方法,但是可用的示例并没有真正深入地解释它。然而,它与这句话混在一起:

这些解决方案总会有一个障碍,那就是 是JDBC本身——很难将其转换为异步API。 事实上,很少有数据库真正支持异步查询执行

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


请不要推荐Scala

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

您开发JDBC异步版本的“想法泡泡”有两个问题:

  • 它确实不适合在JDBCAPI层之上(即在应用程序代码中)实现事务的方式。一个在较少线程上同时处理多个事务的应用程序将变得更加复杂。更复杂(通常)意味着可靠性更低,而这并不是您在执行(常规)数据库操作时想要的

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

    • 一些驱动程序是专有的
    • 所有驱动程序都与后端数据库(在JVM中或通过网络连接)谈论某种非标准的“协议”
    • 这些协议(AFAIK)本质上总是同步的,并且通常是专有的
    • 用支持异步模式的东西更新或替换协议将需要更改数据库实现本身
那么解决方案是什么呢

这个问答有一些链接指向试图实现异步数据库API的项目:“”

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


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

您可能希望查看的答案。@PM77-1感谢您提供的链接,但我已经阅读了该页面上的所有内容。这是几年前提出的问题,最近似乎没有得到太多关注。@Christian.tucker-为什么10个答案没有引起太多关注?说真的,如果你想让人们更加关注它,正确的方法是发一份奖金。感谢你的回复,我最终开始开发自己的小型数据库引擎。它并没有什么大不了的,我也不期望它能像测试过的解决方案一样表现出色,但是现在它能满足我们的需要。我已经使用带有同步查询执行器的NIO2实现了数据库服务器。(自定义查询语言)以防止数据库数据损坏。当前的问题主要与将内容加载到数据库服务器上的内存有关。需要找到一种适当的方法来索引/缓存堆外的数据,而不会过度使用内存。仍在为其他web相关项目使用SQL。