当前位置: 首页 > 知识库问答 >
问题:

程序在Mongodb异步查询完成前终止

蓝逸仙
2023-03-14

我正在学习以下教程:http://mongodb.github.io/mongo-java-driver/3.2/driver-async/reference/crud/。我只是试图连接到数据库,并读取我创建的一个集合,其中包含两个文档:

import com.mongodb.async.SingleResultCallback;
import com.mongodb.async.client.MongoClient;
import com.mongodb.async.client.MongoClients;
import com.mongodb.async.client.MongoCollection;
import com.mongodb.async.client.MongoDatabase;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;

public class Main {

    MongoClient client = MongoClients.create();
    MongoDatabase database = client.getDatabase("mydb");

    public Main() {
        readUsers();
    }


    public void readUsers() {

        MongoCollection<Document> collection = database.getCollection("user");

        // find documents
        collection.find().into(new ArrayList<Document>(),
                new SingleResultCallback<List<Document>>() {
            @Override
            public void onResult(final List<Document> result, final Throwable t) {
                System.out.println("Found Documents: #" + result.size());
            }
        });
    }

    public static void main(String[] args) throws Exception {
        new Main();
    }

}

但我不断得到以下错误:

共有1个答案

景岳
2023-03-14

您需要确保main()代码在readusers返回如下内容之前没有完成:

...
import java.util.concurrent.Semaphore;

public class Main {
    MongoClient client = MongoClients.create();
    MongoDatabase database = client.getDatabase("mydb");
    Semaphore semaphore = new Semaphore(0);

    public Main() throws Exception {
        readUsers();
        semaphore.acquire();
    }


    public void readUsers() {

        MongoCollection<Document> collection = database.getCollection("users");

        // find documents
        collection.find().into(new ArrayList<Document>(),
                new SingleResultCallback<List<Document>>() {
                    @Override
                    public void onResult(final List<Document> result, final Throwable t) {
                        System.out.println("Found Documents: #" + result.size());
                        semaphore.release();
                    }
                });
    }

    public static void main(String[] args) throws Exception {
        new Main();
    }

}
 类似资料:
  • 问题内容: 我有一个使用mongodb本机驱动程序的node.js应用程序。在使用节点v8.9.1将应用程序代码迁移到异步/等待的过程中,我努力寻找一种适合mongodb查询的好方法。mongodb驱动程序的主要问题是,所有查询都使用回调,其中对异步方法来说,promise函数是必需的。 备择方案: 猫鼬 -承诺不赞成使用查询,它会强制使用Schema模型,这对我的应用程序来说有点开销。 mong

  • 我的完成处理程序有问题。下面是一个带有完成处理程序的函数,位于一个实用程序文件中: 我在视图控制器中调用它 输出清楚地表明该函数在运行该块之前没有等待完成: 我如何解决这个问题?

  • 问题内容: 使用AlamoFire框架后,我注意到完成处理程序在主线程上运行。我想知道下面的代码是否是在完成处理程序中创建Core Data导入任务的好习惯: 问题答案: 这是一个非常好的问题。您的方法是完全有效的。但是,Alamofire实际上可以帮助您进一步简化此流程。 您的示例代码调度队列细分 在示例代码中,您将在以下调度队列之间跳转: NSURLSession分派队列 TaskDelega

  • 异步查询能够在数据库执行查询时避免线程阻塞。这对于避免冻结胖客户端应用程序(thick-client application)的 UI 来说很有用。异步操作还能够提升 Web 应用程序的生产能力,在数据库执行查询时线程可以被空出来为其他请求服务。更多信息请查阅 C#异步编程。 警告 EF Core 不支持在同一个上下文实例上运行多并行操作。应该总是在下一个操作开始之前等待上一个操作的完成。这通常是

  • 问题内容: 我对mongodb相当陌生,并且在尝试进行有序mongodb查询时。但是不推荐使用spring数据mongodb的sort方法。所以我用了: 我使用了此代码块。但是它没有对数据进行排序。那么,您可以选择使用任何有用的方法进行此练习吗? 问题答案: 您可以通过这种方式定义排序以忽略大小写:

  • 问题内容: 我遇到了一个问题,其中发生了多个异步请求,这些请求从Facebook API和Firebase数据库获取图像和信息。我想执行所有异步请求,然后将从Facebook API / Firebase数据库获取的所有数据存储到一个可以快速加载的完整对象中。我为每个异步请求设置了完成处理程序,我认为这会迫使程序“等待”直到请求完成,然后继续执行程序,但这似乎对我不起作用。以下是我的尝试: 我知道