Java操作MongoDB报错 java.lang.IllegalStateException: state should be: open

问题描述

  • 我在使用Spark整合MongoDB,涉及到了MongoDB Colletion中的文档删除与新建(也就是更新文档)时,出现了报错java.lang.IllegalStateException: state should be: open
  • 错误代码如下
 /*** 将数据保存到 MongoDB userId -> 1, recs -> 22:4.5|45:3.8** @param userId      用户ID* @param streamRecs  流式的推荐结果* @param mongoConfig MongoDB 的配置*/public static void saveRecListToMongoDB(int userId, Tuple2<Integer, Double>[] streamRecs, Properties mongoConfig) {log.info("准备将实时推荐列表保存到 MongoDB,入参为:userId={} streamRecs={}", userId, streamRecs);// 1.连接到 StreamRecList实时推荐列表MongoCollection<Document> streamRecListCollection = null;try (MongoClient mongoClient = MongoClients.create(mongoConfig.getProperty("mongo.uri"))) {streamRecListCollection = mongoClient.getDatabase(mongoConfig.getProperty("mongo.db")).getCollection(mongoConfig.getProperty("mongo.collection"));}// 2.删除 Mongo collection 中已存在的记录log.info("删除 Mongo collection 中已存在的用户 userId={} 的实时推荐表", userId);// fixme java.lang.IllegalStateException: state should be: openstreamRecListCollection.findOneAndDelete(Filters.eq("userId", userId));// 3.插入文档(即将用户实时推荐列表写入到MongoDB)List<Document> recList = Arrays.stream(streamRecs).map(rec ->new Document().append("movieId", rec._1).append("rating", rec._2)).collect(Collectors.toList());Document doc = new Document("userId", userId).append("recs", recList);streamRecListCollection.insertOne(doc);}

分析原因与解决

  • 1)我在想,既然Java编译器在编译器没有报错,那就应该不存在受检异常
  • 2)查找网络资料后,分析问题应该是出现在MongoDB连接的问题上,因此我检查了我的配置文件,如下:
# Mongo相关配置
mongo.uri=mongodb://192.168.188.128:27017,192.168.188.129:27017,192.168.188.130:27017/recommend
mongo.db=recommend
  • 3)配置文件也正确,那我们没有思绪了
  • 4)又想到是因为MongoDB连接上的问题,我又看到了在代码中使用了 try-with-resource语法,我觉得是因为这个语法的原因,因此我将对MongoDB 的操作都包裹在了try-with-resource中,代码如下:
    public static void saveRecListToMongoDB(int userId, Tuple2<Integer, Double>[] streamRecs, Properties mongoConfig) {log.info("准备将实时推荐列表保存到 MongoDB,入参为:userId={} streamRecs={}", userId, streamRecs);// 1.连接到 StreamRecList实时推荐列表MongoCollection<Document> streamRecListCollection = null;try (MongoClient mongoClient = MongoClients.create(mongoConfig.getProperty("mongo.uri"))) {streamRecListCollection = mongoClient.getDatabase(mongoConfig.getProperty("mongo.db")).getCollection(mongoConfig.getProperty("mongo.collection"));// 2.删除 Mongo collection 中已存在的记录log.info("删除 Mongo collection 中已存在的用户 userId={} 的实时推荐表", userId);// fixme java.lang.IllegalStateException: state should be: openstreamRecListCollection.findOneAndDelete(Filters.eq("userId", userId));// 3.插入文档(即将用户实时推荐列表写入到MongoDB)List<Document> recList = Arrays.stream(streamRecs).map(rec ->new Document().append("movieId", rec._1).append("rating", rec._2)).collect(Collectors.toList());Document doc = new Document("userId", userId).append("recs", recList);streamRecListCollection.insertOne(doc);}}

至此,Bug成功解决了

Bug复现

  • 1)Bug代码如下:
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import org.bson.Document;/*** 演示 fixme java.lang.IllegalStateException: state should be: open*/
public class BugTest {public static void main(String[] args) {// 1.连接到 StreamRecList实时推荐列表MongoCollection<Document> collection = null;try (MongoClient mongoClient = MongoClients.create("mongodb://192.168.188.150:27017/testdb")) {collection = mongoClient.getDatabase("testdb").getCollection("user");}// 2.删除 Mongo collection 中已存在的记录// fixme java.lang.IllegalStateException: state should be: opencollection.findOneAndDelete(Filters.eq("userId", 1));// 3.插入文档(即将用户实时推荐列表写入到MongoDB)Document doc = new Document("userId", 2);collection.insertOne(doc);}
}
  • 2)报错堆栈信息如下:
Exception in thread "main" java.lang.IllegalStateException: state should be: openat com.mongodb.assertions.Assertions.isTrue(Assertions.java:72)at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:167)at com.mongodb.internal.connection.SingleServerCluster.getDescription(SingleServerCluster.java:41)at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:155)at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:105)at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:287)at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:211)at com.mongodb.client.internal.MongoCollectionImpl.executeFindOneAndDelete(MongoCollectionImpl.java:733)at com.mongodb.client.internal.MongoCollectionImpl.findOneAndDelete(MongoCollectionImpl.java:714)at com.mongodb.client.internal.MongoCollectionImpl.findOneAndDelete(MongoCollectionImpl.java:708)at com.clear.bug.BugTest.main(BugTest.java:23)
  • 3)将MongoDB相关操作放入try-with-resource即可成功运行
public class BugTest {public static void main(String[] args) {// 1.连接到 StreamRecList实时推荐列表MongoCollection<Document> collection = null;try (MongoClient mongoClient = MongoClients.create("mongodb://192.168.188.150:27017/testdb")) {collection = mongoClient.getDatabase("testdb").getCollection("user");// 2.删除 Mongo collection 中已存在的记录collection.findOneAndDelete(Filters.eq("userId", 1));// 3.插入文档(即将用户实时推荐列表写入到MongoDB)Document doc = new Document("userId", 2);collection.insertOne(doc);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java并发编程十】同步控制二

Semaphore 信号量 Semaphore可以减少负载&#xff0c;使限制同时运行的线程数量。Semaphore的执行过程是先获取一定数量的线程&#xff0c;执行完一个释放一个semaphore&#xff0c;再去执行一个新的线程。 import java.util.ArrayList; import java.util.concurrent.Executor…

【STM32】TF卡FTA32文件系统

一、SD卡介绍 1.SD简介 本质&#xff1a;NandFlash控制芯片 2.SD卡存储容量等级 3.FAT文件系统的使用 4.SD卡速度等级 5.SD卡驱动方式 1.SDIO&&SD 1&#xff09;SDIO接口通信线&#xff1a;CLK/CMD/DAT0-3&#xff08;数据传输线4根&#xff09; 2&#xff09;SPI接口…

高压开关柜无线测温系统

高压开关柜无线测温系统是一种用于监测高压开关柜内部温度的系统。依托电易云-智慧电力物联网&#xff0c;它采用无线通信技术&#xff0c;实现对开关柜内部温度的实时监测和数据传输。下面我将为您介绍高压开关柜无线测温系统的组成、原理、功能以及优势。 一、系统组成 高压开…

JAVA项目测试----用户管理系统

一)项目简介: 用户管理系统是依据于前后端分离来实现的&#xff0c;是基于Spring SpringBoot Spring MVC&#xff0c;SpringAOP&#xff0c;MyBatis等框架来实现的一个用户管理网站&#xff0c;并且已经部署到了云服务器上, 目前的用户管理系统实现了超级管理员的注册功能&…

竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

python中Thread实现多线程任务

目录 多线程概括&#xff1a; 使用 Thread 模块创建线程 如果不使用多线程&#xff1a; 多线程概括&#xff1a; 多线程是一种并发执行的编程方式&#xff0c;允许程序同时执行多个独立的线程&#xff0c;每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

csdn - mermaid

目录 方向节点样式形状箭头 子图流程图类图uml图甘特图 https://blog.csdn.net/sandalphon4869/article/details/89341443 https://blog.csdn.net/swinfans/article/details/89393853 https://zhuanlan.zhihu.com/p/614018391 https://blog.csdn.net/qq_42491125/article/detai…

万字长文深入理解 cache,写出高性能代码

CACHE的一致性 Cache的一致性有这么几个层面 1. 一个CPU的icache和dcache的同步问题 2. 多个CPU各自的cache同步问题 3. CPU与设备&#xff08;其实也可能是个异构处理器&#xff0c;不过在Linux运行的CPU眼里&#xff0c;都是设备&#xff0c;都是DMA&#xff09;的cache同…

用百度AI大模型给头像换风格

心血来潮想尝试尝试AI小应用&#xff0c;给图片加个风格&#xff08;例如微信头像&#xff09;&#xff0c;于是有了这篇简短的教程 目录 1. 领取免费资源2. 在应用列表创建应用3. 在线API调试4. 效果对比 1. 领取免费资源 网站&#xff1a;百度智能云 百度给提供了很多AIGC的…

OpenCV入门7——OpenCV中的滤波器(包括低通滤波与高通滤波,其中低通滤波用于降噪,而高通滤波用于边缘检测)

文章目录 图像滤波卷积相关概念锚点 实战图像卷积Blur an image with a 2d convolution matrix 方盒滤波与均值滤波高斯滤波中值滤波双边滤波高通滤波—索贝尔算子高通滤波—沙尔算子高通滤波—拉普拉斯算子边缘检测Canny 图像滤波 卷积核滤波器 卷积相关概念 锚点 锚点…

详解硬盘的接口、总线和协议

总线&#xff1a;总线是计算机系统中用于连接各个硬件组件的一种通信方式&#xff0c;它可以实现数据、地址和控制信号的传输。在服务器中&#xff0c;内部总线起着承载数据和控制信号的重要作用。总线在单位时间内能传输数据量称为带宽。分为SATA&#xff0c;SAS&#xff0c;P…

linux 系统调用流程分析

x86 1.系统调用 系统调用是用户空间程序与内核交互的主要机制。系统调用与普通函数调用不同&#xff0c;因为它调用的是内核里的代码。使用系统调用时&#xff0c;需要特殊指令以使处理器权限转换到内核态。另外&#xff0c;被调用的内核代码由系统调用号来标识&#xff0c;而…

牛顿迭代法求平方根--C++简单实现

1. 简介 牛顿迭代法是求近似根的一种方法。 以求平方根为例。 如 x 2 m x^2m x2m 令 f ( x ) x 2 − m f(x)x^2-m f(x)x2−m 则 f ′ ( x ) 2 x f(x)2x f′(x)2x 函数 f ( x ) f(x) f(x)在 x 0 x_0 x0​处的切线方程为 g ( x ) f ′ ( x 0 ) ( x − x 0 ) f ( x 0 ) g(…

Android studio Build Log乱码+错误: 找不到符号符号

控制台输出乱码&#xff0c;首先解决乱码问题&#xff0c;才可以精确的知道问题所在&#xff1b; android studio>Help>Edit Custom VM Options... 输出一行代码在里面&#xff0c;保存&#xff0c;重启IDE -Dfile.encodingUTF-8 Clean 一下工程&#xff0c;然后Rebu…

【Django-02】 Model模型和模型描述对象Meta

Model和Meta 概念ModelMetaModel支持的字段类型Meta 属性例子 概念 就是对象的意思&#xff0c;底层一个Model对应一张表&#xff0c;而Meta是Model的内部类&#xff0c;是用来描述Model和数据库表的相关元数据信息&#xff0c;比如主键&#xff0c;排序&#xff0c;unique_ke…

上门维修安装派单系统小程序APP开发之会员级别设计深度解析

啄木鸟鲁班大师上门安装维修平台APP开发之VIP会员解析&#xff0c;在APP或者小程序里设置的会员叫VIP级别会员&#xff0c;系统一共分为4种会员&#xff0c;注册会员&#xff0c;正式会员&#xff0c;VIP金卡会员&#xff0c;VIP钻卡会员。注册用户是指注册了平台但是没有消费记…

预计2023年交付35万台,增速超400%!HUD硬核玩家强势崛起

随着HUD市场渗透率加速提升&#xff0c;其高速增长期已经来临。 W-HUD和AR-HUD在中国市场的萌芽导入期是在2020年前后&#xff0c;此前HUD市场不温不火&#xff0c;主要归因于以往W-HUD FOV较小&#xff0c;成像画面有限&#xff0c;显示内容简单且效果粗糙&#xff1b;而AR-H…

解决selenium使用chrome下载文件(如pdf)时,反而打开浏览器的预览界面

文章目录 解决方法完整的配置 解决方法 在初始化浏览器的时候&#xff0c;添加以下配置即可&#xff1a; option webdriver.ChromeOptions()prefs {"profile.managed_default_content_settings.images": 2, # 禁止加载图片# permissions.default.stylesheet: 2, …

Linux下使用宏定义判断系统架构和系统类型

文章目录 查看编译器当前支持的宏定义查找指定的宏不同架构不同系统 附录-编译器内部常用的一些宏定义宏定义实际应用使用宏定义判断系统架构使用宏定义判断系统类型 一般情况下在linux下做C/C方面的开发不需要太关注系统架构&#xff0c;当然如果涉及到不同架构下的适配问题&a…

软考小记-软件工程

模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围&#xff0c;凡是受这个判定影响的所有模块都属于这个判定的作用范围.&#xff0c;原则上一个模块的作用范围应该在其控制范围之内&#xff0c;若没有&#xff0c;则可以将判定所在模块…