升级驱动程序版本
在本页面上
概述
在本节中,您可以识别出您必须对应用程序进行的更改,以便将驱动程序升级到新版本。
在升级之前,请执行以下操作
确保新版本与您的应用程序连接的MongoDB服务器版本以及应用程序运行的Java运行时环境(JRE)兼容。有关信息,请参阅兼容性页面。
在重大更改部分中解决当前应用程序使用的驱动程序版本和计划升级版本之间的任何重大更改。有关MongoDB服务器版本兼容性更改的更多信息,请参阅服务器发布兼容性更改部分。
技巧
为了最大限度地减少在将来升级驱动程序版本时应用程序可能需要进行的更改数量,请使用稳定API。
重大更改
重大更改是指驱动程序特定版本中规范或行为的修改,如果不解决,可能会阻止应用程序在升级之前正常运行。
本节中的重大更改按引入它们的驱动程序版本进行分类。在升级驱动程序版本时,解决当前版本和升级版本之间的所有重大更改。例如,如果您正在将驱动程序从v4.0升级到v4.5,则解决v4.0之后的版本以及任何在v4.5下列出的所有重大更改。
版本5.2重大更改
该驱动程序不再兼容MongoDB服务器版本v3.6。有关此更改的更多信息,请参阅驱动程序版本5.2服务器支持更改部分。
版本5.0重大更改
本驱动程序版本引入以下重大更改
对以下内容进行以下更改
ConnectionId
类ConnectionId
构造函数现在接受类型为long
的值作为其第二个参数,而不是类型int
。同样,构造函数现在接受类型为Long
的值作为其第三个参数,而不是类型Integer
。由于此更改破坏了二进制兼容性,请重新编译调用ConnectionId
构造函数的任何现有代码。withServerValue()
方法现在接受类型为long
的参数,而不是类型int
。此更改破坏了二进制兼容性,因此您必须重新编译调用withServerValue()
方法的任何代码。getServerValue()
方法现在返回类型为Long
的值,而不是类型Integer
。同样,getLocalValue()
方法返回类型为long
的值,而不是类型int
。由于此更改破坏了二进制和源兼容性,请更新使用这些方法的任何源代码并重新构建二进制文件。
用来自
org.bson.codecs.record.annotations
包的以下记录注解替换了来自org.bson.codecs.pojo.annotations
包的相同名称的注解BsonId
BsonProperty
BsonRepresentation
更改了
SocketSettings.Builder.connectTimeout()
和SocketSettings.Builder.readTimeout()
方法中的超时持续时间参数的数据类型。该参数的数据类型现在是long
而不是int
。在早期版本中,此参数在这两个方法中均为类型
int
。此更改破坏了二进制兼容性,需要重新编译,但不需要代码更改。删除了在
Beta
中独家发布的Filters.eqFull()
方法,该方法允许您在执行向量搜索时构建等值过滤器。您可以在实例化VectorSearchOptions
类型时使用Filters.eq()
方法,如下面的代码所示VectorSearchOptions opts = vectorSearchOptions().filter(eq("x", 8));
删除了
org.mongodb.scala.ObservableImplicits.ToSingleObservableVoid
隐式类。这意味着org.reactivestreams.Publisher[Void]
类型不再自动转换为org.mongodb.scala.SingleObservable[Void]
。API还公开了org.mongodb.scala.Observable[Unit]
而不是org.mongodb.scala.Observable[Void]
。更多信息,请参阅Scala API 文档中的 Observable 特质。
修改了
ClusterSettings
计算ClusterConnectionMode
的方式,使其通过使用指定的副本集名称来提高一致性,而不管其配置方式如何。以前,只有当副本集名称通过连接字符串设置时,才会考虑副本集名称。例如,以下两个代码示例都返回值
ClusterConnectionMode.MULTIPLE
,而之前第二个示例返回的是ClusterConnectionMode.SINGLE
。ClusterSettings.builder() .applyConnectionString(new ConnectionString("mongodb://127.0.0.1:27017/?replicaSet=replset")) .build() .getMode() ClusterSettings.builder() .hosts(Collections.singletonList( new ServerAddress("127.0.0.1", 27017) )) .requiredReplicaSetName("replset") .build() .getMode() 修改了
BsonDecimal128
值对方法调用的响应方式,使其与Decimal128
值以相同的方式进行响应。特别是,BsonDecimal128.isNumber()
现在返回true
,而BsonDecimal128.asNumber()
返回等效的BsonNumber
。删除了ServerAddress方法
getSocketAddress()
和getSocketAddresses()
。不再使用
getSocketAddress()
,而是使用java.net.InetAddress
的实例方法getByName()
。不再使用
getSocketAddresses()
,而是使用java.net.InetAddress
的实例方法getAllByName()
。删除了 UnixServerAddress 方法
getSocketAddress()
和getUnixSocketAddress()
。而不是使用
getUnixSocketAddress()
,构建一个jnr.unixsocket.UnixSocketAddress
实例。将 UNIX 套接字文件的完整路径传递给构造函数。默认情况下,MongoDB 在"/tmp/mongodb-27017.sock"
创建一个 UNIX 套接字文件。有关UnixSocketAddress
的更多信息,请参阅 UnixSocketAddress API 文档。删除了
Parameterizable
接口。如果编解码器用于参数化类型,则不是在自定义Codec
类型上实现此接口,而是在编解码器的CodecProvider
上重写CodecProvider.get()
方法。从
ReadPreference
和TaggableReadPreference
类中删除了isSlaveOk()
方法。要检查读取偏好是否允许从副本集的次要成员读取,请使用这些类中的isSecondaryOk()
方法。从
collStats
命令中删除了DBCollection.getStats()
和DBCollection.isCapped()
辅助方法。而不是这些方法,您可以使用$collStats
聚合管道阶段。移除了
MapCodec
和IterableCodec
类。不再使用MapCodec
,而是使用MapCodecProvider
。不再使用IterableCodec
,而是使用CollectionCodecProvider
,或者对于不是Collection
类型的Iterable
类型,使用IterableCodecProvider
。从
MapReducePublisher
和MapReduceIterable
类中移除了sharded()
和nonAtomic()
方法。移除了以下用于与
geoHaystack
索引一起使用的方法Indexes.geoHaystack()
IndexOptions.getBucketSize()
IndexOptions.bucketSize()
相反,您可以使用
$geoNear
聚合管道阶段或2d索引上的地理空间查询操作符。有关更多信息,请参阅MongoDB服务器手册中的地理空间查询页面。从查找操作中移除了
oplogReplay
选项。这包括以下方法DBCursor.oplogReplay()
DBCollectionFindOptions.isOplogReplay()
DBCollectionFindOptions.oplogReplay()
FindPublisher.oplogReplay()
FindIterable.oplogReplay()
移除了以下
Exception
构造函数MongoBulkWriteException(BulkWriteResult, List<BulkWriteError>, WriteConcernError, ServerAddress)
MongoCursorNotFoundException(long, ServerAddress)
MongoQueryException(ServerAddress, int, String)
MongoQueryException(ServerAddress, int, String, String)
MongoQueryException(MongoCommandException)
移除了以下对
BulkWriteResult.acknowledged()
方法的重载acknowledged(Type, int, List<BulkWriteUpsert>)
acknowledged(Type, int, Integer, List<BulkWriteUpsert>)
acknowledged(int, int, int, Integer, List<BulkWriteUpsert>)
移除了以下
ChangeStreamDocument
构造函数ChangeStreamDocument(String, BsonDocument, BsonDocument, BsonDocument, TDocument, TDocument, BsonDocument, ...)
ChangeStreamDocument(String, BsonDocument, BsonDocument, BsonDocument, TDocument, BsonDocument, BsonTimestamp, ...)
ChangeStreamDocument(OperationType, BsonDocument, BsonDocument, BsonDocument, TDocument, BsonDocument, BsonTimestamp, ...)
移除了以下事件的构造函数
CommandEvent(RequestContext, int, ConnectionDescription, String)
CommandEvent(int, ConnectionDescription, String)
CommandEvent(RequestContext, long, int, ConnectionDescription, String)
CommandFailedEvent(RequestContext, int, ConnectionDescription, String, long, Throwable)
CommandFailedEvent(int, ConnectionDescription, String, long, Throwable)
CommandStartedEvent(RequestContext, int, ConnectionDescription, String, String, BsonDocument)
CommandStartedEvent(int, ConnectionDescription, String, String, BsonDocument)
CommandSucceededEvent(RequestContext, int, ConnectionDescription, String, BsonDocument, long)
CommandSucceededEvent(int, ConnectionDescription, String, BsonDocument, long)
ConnectionCheckedInEvent(ConnectionId)
ConnectionCheckedOutEvent(ConnectionId, long)
ConnectionCheckedOutEvent(ConnectionId)
ConnectionCheckOutFailedEvent(ServerId, long, Reason)
ConnectionCheckOutFailedEvent(ServerId, Reason)
ConnectionCheckOutStartedEvent(ServerId)
ConnectionReadyEvent(ConnectionId)
ServerHeartbeatFailedEvent(ConnectionId, long, Throwable)
ServerHeartbeatSucceededEvent(ConnectionId, BsonDocument, long)
从
WriteConcernError
类中移除了errorLabels
选项。这包括addLabel()
和getErrorLabels()
方法以及包含errorLabels
参数的构造函数。相反,您可以使用包含WriteConcernError
的MongoException
对象中包含的错误标签。从
com.mongodb.event
包中移除了以下类ConnectionAddedEvent
ConnectionPoolOpenedEvent
ConnectionRemovedEvent
ClusterListenerAdapter
ConnectionPoolListenerAdapter
ServerListenerAdapter
ServerMonitorListenerAdapter
由于这些删除,以下方法也从
ConnectionPoolListener
接口中删除了:connectionAdded
connectionPoolOpened
connectionRemoved
有关事件包的更多信息,请参阅com.mongodb.event包文档
为
listCollections
命令添加了对新authorizedCollection
选项的支持。这导致MongoDatabase.listCollectionNames()
方法中出现了破坏性的二进制更改,意味着使用这些方法的任何代码都必须重新编译。此更改不需要对源代码进行任何更改。删除了以下与Stream接口相关的以下方法和类型
streamFactoryFactory()
方法来自MongoClientSettings.Builder
。请使用MongoClientSettings.Builder.transportSettings()
方法。getStreamFactoryFactory()
方法来自MongoClientSettings
。请使用MongoClientSettings.getTransportSettings()
方法。NettyStreamFactoryFactory
类。请使用可由TransportSettings.nettyBuilder()
创建的NettyTransportSettings
,并通过MongoClientSettings.Builder.transportSettings()
应用。NettyStreamFactory
类AsynchronousSocketChannelStreamFactory
类AsynchronousSocketChannelStreamFactoryFactory
类BufferProvider
接口SocketStreamFactory
类Stream
接口StreamFactory
接口StreamFactoryFactory
接口TlsChannelStreamFactoryFactory
类
版本 4.8 破坏性变更
驱动程序结束了对连接到 MongoDB 服务器版本 v3.4 及更早版本的支持。有关此更改的更多信息,请参阅驱动程序版本 4.8 服务器支持更改部分。
如果您的应用程序在 OSGi 容器中部署驱动程序并依赖于驱动程序对 Java 记录进行编码和解码,则必须添加对
org.bson.codecs.record
模块的显式依赖。在 v4.6 中实现的
RecordCodec
将指定为记录List
或Map
字段类型参数的 POJO 和记录类反序列化为Document
值,而不是它们的相应类。此版本现在将它们反序列化为正确的记录和 POJO 类型。例如,以下记录类定义显示了包含一个
List
的Book
记录,该列表接受一个Chapter
类型参数public record Book(String title, List<Chapter> chapters) {} public record Chapter(Integer number, String text) {} 从本版本开始,编解码器将
List
中的数据反序列化为Chapter
记录类,而不是Document
值。
版本 4.7 破坏性变更
构建器API
setWindowFields
已不再处于测试阶段。新构建器破坏了二进制和源代码兼容性。有关新setWindowFields()
方法签名的信息,请参阅聚合API文档。如果您的应用程序使用的是低于v4.7的版本,请更新源代码以使用新的方法签名,并重新构建二进制文件。
版本4.2重大变更
已更新
ObjectId
类及其serialVersionUID
字段,以使用一种新的格式,该格式可以最大程度地减少不同版本驱动程序之间的序列化兼容性问题。如果使用此版本或更高版本的驱动程序的应用程序尝试对包含
ObjectId
的任何对象进行Java对象序列化,而这些对象是由先前版本的驱动程序序列化的,Java将抛出InvalidClassException
。要了解有关Java对象序列化的更多信息,请参阅Java文档中关于可序列化对象。
版本 4.0 的重大更改
在3.12版本中标记为已弃用的几个类和方法在本版本中被删除。
插入辅助方法现在返回一个插入结果对象,而不是返回
void
。BsonDocument
、Document
和DbObject
上的toJson()
方法现在返回一个宽松的JSON格式,而不是严格的JSON格式。这使得JSON文档更易于阅读,但可能会使识别BSON类型信息(例如32位和64位整数的区别)变得更加困难。如果您的应用程序依赖于严格的JSON格式,请在读写数据时使用严格模式。java.util.UUID
值的默认BSON表示从JAVA_LEGACY
更改为UNSPECIFIED
。存储或检索UUID值的应用程序必须明确指定要使用的表示形式。您可以在MongoClientSettings
的uuidRepresentation
属性中指定表示形式。您指定的UUID表示形式严格控制驱动程序如何解码UUID。在驱动程序的先前版本中,如果您指定了
JAVA_LEGACY
表示形式,则驱动程序会将子类型3和4的二进制对象解码为UUID。在版本4.0中,JAVA_LEGACY
表示形式仅与子类型3一起工作。关于枚举
UuidRepresentation
的成员列表,请参阅 v4.0 API 文档。连接池不再限制等待队列线程或需要连接到 MongoDB 的异步任务的数量。应用程序将根据需要调整请求,而不是依赖驱动程序抛出
MongoWaitQueueFullException
。驱动程序不再使用
java.util.logging
(JUL) 包进行日志记录,仅支持 SLF4J 日志框架。已删除嵌入式和 Android 驱动程序。如果您的应用程序依赖于这些驱动程序,您必须继续使用 3.x Java 驱动程序版本。
已停止发布超级 JAR,包括
mongo-java-driver
和mongodb-driver
。如果您的应用程序依赖于其中之一,您必须根据应用程序使用的 API 切换到mongodb-driver-sync
或mongodb-driver-legacy
。确保从您的依赖关系中删除超级 JAR。对几个类的更新引入了二进制兼容性问题,例如将插入辅助方法的签名更改。请重新编译链接到此版本或更高版本的驱动程序的任何类,以确保它们继续工作。
服务器发布兼容性更改
服务器发布兼容性更改是对 MongoDB Java Reactive Streams 驱动程序的修改,该修改取消了对于一组 MongoDB 服务器版本的兼容性支持。
在达到生命周期结束 (EOL) 后,驱动程序将停止支持 MongoDB 服务器版本。
有关 MongoDB 对 EOL 产品的支持信息,请参阅 遗留支持策略。
驱动程序版本 5.2 服务器支持变更
5.2 版本的驱动程序不再支持 MongoDB 服务器 v3.6。要使用 5.2 版本的驱动程序,您的 MongoDB 服务器版本必须为 v4.0 或更高版本。有关如何升级 MongoDB 服务器部署的说明,请参阅 MongoDB 服务器手册中的发行说明。
服务器版本 8.1 支持变更
您不能使用 Java Reactive Streams 驱动程序的 3.x 版本来连接到运行 MongoDB 服务器 v8.1 的部署。从 MongoDB 服务器 v8.1 开始,buildinfo
命令需要身份验证,这导致与 v3.x 驱动程序不兼容。
驱动程序版本 4.8 服务器支持变更
4.8 版本的驱动程序不再支持 MongoDB 服务器 v3.4 及更早版本。要使用 4.8 版本的驱动程序,您的 MongoDB 服务器版本必须为 v3.6 或更高版本。有关如何升级 MongoDB 服务器部署的说明,请参阅 MongoDB 服务器手册中的发行说明。