我正在使用我的 aws lamda 访问 mongo db 集合。我已将 mongo srv uri 连接设置为 lamda 环境变量并使用 mongodb-driver-sync 依赖项。
public class JobStatusEventHandler implements RequestHandler<SNSEvent, Boolean> {
public JobStatusEventHandler() {
mongoClient = MongoClients.create(System.getenv("MONGODB_URI"));
}
@Override
public Boolean handleRequest(SNSEvent snsEvent, Context context) {
MongoDatabase database = mongoClient.getDatabase("docdb");
logger.log("database " + database.getName());
MongoCollection<Document> collection = database.getCollection("jobs");
logger.log("collection: "+ collection.countDocuments());
}
}
问题是它打印数据库名称,但当尝试执行集合方法时,它会给出
java.net.SocketTimeoutException: Connect timed out
错误。
我也将 aws nat 网关 ips 列入了 aws 网络 IP 访问列表中的白名单。
连接成功并且还记录了数据库名称,这怎么可能?
client
实例的创建、带有getDB
的数据库和带有getCollection
的集合实际上并没有与Mongo建立连接。这会延迟到真正需要在 Mongo 上运行的第一个命令为止。就您而言,那就是 collection.countDocuments()
。
因此,如果您将
database.getCollection("jobs")
和 database.getCollection("jobs").countDocuments()
的日志分开,您会发现它对 getCollection()
有效,但对 countDocuments()
失败。此时实际上已经建立了与 Mongo 的连接,但无法连接。