# Java Driver: Migrating From 4.11 to 5.0

## Introduction

The MongoDB Java driver 5.0.0 is now available!

While this version doesn't include many new features, it's removing a lot of deprecated methods and is preparing for the
future.

## How to upgrade

- Ensure your server version is compatible with Java Driver 5.0.
- Compile against the 4.11 version of the driver with deprecation warnings enabled.
- Remove deprecated classes and methods.

### Maven

```xml

    org.mongodb
    mongodb-driver-sync
    5.0.0

```

### Gradle

```
implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: '5.0.0'
```

## New features

You can
read the full list of new features
but here is a summary.

### getElapsedTime()

The behavior of the method `getElapsedTime()` was modified in the following classes:

```text
com.mongodb.event.ConnectionReadyEvent
com.mongodb.event.ConnectionCheckedOutFailedEvent
com.mongodb.event.ConnectionCheckedOutEvent
```

If you are using one of these methods, make sure to recompile and
read the details.

### authorizedCollection option

5.0.0 adds support for the `authorizedCollection` option of the `listCollections` command.

### Scala

The `org.mongodb.scala.Observable.completeWithUnit()` method is now marked deprecated.

## Breaking changes

One of the best ways to identify if your code will require any changes following the upgrade to Java Driver 5.0 is to compile against 4.11.0 with deprecation warnings enabled and remove the use of any deprecated methods and classes.

You can read the full list of breaking changes but here is a summary.

### StreamFactoryFactory and NettyStreamFactoryFactory

The following methods and classes have been removed in 5.0.0: 

- `streamFactoryFactory()` method from `MongoClientSettings.Builder`
- `getStreamFactoryFactory()` method from `MongoClientSettings`
- `NettyStreamFactoryFactory` class
- `NettyStreamFactory` class
- `AsynchronousSocketChannelStreamFactory` class
- `AsynchronousSocketChannelStreamFactoryFactory` class
- `BufferProvider` class
- `SocketStreamFactory` class
- `Stream` class
- `StreamFactory` class
- `StreamFactoryFactory` class
- `TlsChannelStreamFactoryFactory` class

If you configure Netty using the `streamFactoryFactory()`, your code is probably like this: 

```java
import com.mongodb.connection.netty.NettyStreamFactoryFactory;
// ...
MongoClientSettings settings = MongoClientSettings.builder()
        .streamFactoryFactory(NettyStreamFactoryFactory.builder().build())
        .build();
```

Now, you should use the `TransportSettings.nettyBuilder()`:

```java
import com.mongodb.connection.TransportSettings;
// ...
MongoClientSettings settings = MongoClientSettings.builder()
        .transportSettings(TransportSettings.nettyBuilder().build())
        .build();
```

### ConnectionId

In 4.11, the class `ConnectionId` was using integers.

```java
@Immutable
public final class ConnectionId {
    private static final AtomicInteger INCREMENTING_ID = new AtomicInteger();

    private final ServerId serverId;
    private final int localValue;
    private final Integer serverValue;
    private final String stringValue;
    // ...
}
```

```java
@Immutable
public final class ConnectionId {
    private static final AtomicLong INCREMENTING_ID = new AtomicLong();
    private final ServerId serverId;
    private final long localValue;
    @Nullable
    private final Long serverValue;
    private final String stringValue;
// ...
}
```

While this should have a very minor impact on your code, it's breaking binary and source compatibility. Make sure to
rebuild your binary and you should be good to go.

### Package update

Three record annotations moved from:

```text
org.bson.codecs.record.annotations.BsonId
org.bson.codecs.record.annotations.BsonProperty
org.bson.codecs.record.annotations.BsonRepresentation
```

To:

```text
org.bson.codecs.pojo.annotations.BsonId
org.bson.codecs.pojo.annotations.BsonProperty
org.bson.codecs.pojo.annotations.BsonRepresentation
```

So if you are using these annotations, please make sure to update the imports and rebuild.

### SocketSettings is now using long

The first parameters of the two following builder methods in `SocketSettings` are now using a long instead of an
integer.

```java
public Builder connectTimeout(final long connectTimeout, final TimeUnit timeUnit) {/*...*/}
public Builder readTimeout(final long readTimeout, final TimeUnit timeUnit){/*...*/}
```

This breaks binary compatibility but shouldn't require a code change in your code.

### Filters.eqFull()

`Filters.eqFull()` was only released in `Beta` for vector search. It's now deprecated. Use `Filters.eq()` instead when
instantiating a `VectorSearchOptions`.

```java
VectorSearchOptions opts = vectorSearchOptions().filter(eq("x", 8));
```

### ClusterConnectionMode

The way the driver is computing the `ClusterConnectionMode` is now more consistent by using a specified replica set
name, regardless of how it's configured.

In the following example, both the 4.11 and 5.0.0 drivers were returning the same
thing: `ClusterConnectionMode.MULTIPLE`.

```java
ClusterSettings.builder()
  .applyConnectionString(new ConnectionString("mongodb://127.0.0.1:27017/?replicaSet=replset"))
  .build()
  .getMode();
```

But in this example, the 4.11 driver was returning `ClusterConnectionMode.SINGLE` instead
of `ClusterConnectionMode.MULTIPLE`.

```java
ClusterSettings.builder()
  .hosts(Collections.singletonList(new ServerAddress("127.0.0.1", 27017)))
  .requiredReplicaSetName("replset")
  .build()
  .getMode();
```

### BsonDecimal128

The behaviour of `BsonDecimal128` is now more consistent with the behaviour of `Decimal128`.

```java
BsonDecimal128.isNumber(); // returns true
BsonDecimal128.asNumber(); // returns the BsonNumber
```

## Conclusion

With the release of MongoDB Java Driver 5.0.0, it's evident that the focus has been on refining existing functionalities, removing deprecated methods, and ensuring compatibility for future enhancements. While the changes may necessitate some adjustments in your codebase, they pave the way for a more robust and efficient development experience.

Ready to upgrade? Dive into the latest version of the MongoDB Java drivers and start leveraging its enhanced capabilities today!

To finish with, don't forget to enable virtual threads in your Spring Boot 3.2.0+ projects! You just need to add this in your `application.properties` file:

```properties
spring.threads.virtual.enabled=true
```

Got questions or itching to share your success? Head over to the MongoDB Community Forum – we're all ears and ready to help!