MongoDB异步与同步Java驱动程序

13

我对Mongodb的Java驱动程序感到非常困惑。阅读官方文档,似乎可以使用普通的MondoDB Driver或MongoDB Async Driver。

第一个问题是:我可以在同一个应用程序中同时使用两个驱动程序吗,还是必须选择一个?

尝试使用Async驱动程序时,我发现曾经使用普通驱动程序完成的一些操作现在让我有点迷失。例如,我曾经这样做:

FindIterable<Document> iterable = db.getCollection("my_coll").find(query);
String json = JSON.serialize(iterable);

现在我真的不知道如何将结果转换为 JSON 字符串,因为异步驱动程序没有包含 JSON 类。第二个问题是:如果我不能同时使用两个驱动程序,那么如何序列化一个 FindIterable<Document>

2个回答

5
答案如下:
  • 当然可以同时使用两个驱动程序。实际上,如果你真的关心应用程序的性能,那么你应该在需要从MongoDB获得响应的操作(如find())中使用Sync驱动程序。而在不需要响应的“fire and forget”操作(如insert或update)中,则应该使用Async驱动程序。
  • 因此,上述问题的序列化问题得到了解答。如果你得到了一个响应,那么你正在使用同步驱动程序,因此可以继续使用JSON类:

JSON.serialize(iterable);


16
同步(Sync)与异步(Async)在一般情况下都不会带来性能上的优势,选择使用异步驱动的主要优势在于它可以让你执行重叠查询。如果你有多个不依赖彼此的查询需要执行,可以异步执行它们,并在同步点一起等待结果。请注意,这并不改变原文的意思。 - James Dunne

1

需要注意的一件事是这两个驱动程序共享一些依赖项。尽量使驱动程序的版本对齐,以便它们都期望使用相同版本的公共依赖项,否则可能会出现一些“类未找到”类型的问题,因为类加载器选择了不兼容的类版本之一或另一种驱动程序。

我想补充的是,我发现异步驱动程序非常适合大型导出式查询的用例,其中我必须从 Web 服务返回大量数据。在这种情况下,我必须返回一个大型 CSV。以前,这种方法会使用大量 RAM 构建整个 CSV 数据集,然后将其写入客户端。使用异步驱动程序,我可以从 MongoDB 中读取小批量记录(每次约 500 条记录最佳),并将它们作为分块响应写入浏览器客户端。


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