Skip to content

Commit 1f3fb16

Browse files
authored
[spring] Batch update and Java 23 (#9370)
The commit: - Use batch update in spring-webflux - Upgrade Java 21 to Java 23 - Increase the connection pool from 256 to 512 - Upgrade to Spring Boot 3.3.5
1 parent f897d20 commit 1f3fb16

File tree

12 files changed

+50
-39
lines changed

12 files changed

+50
-39
lines changed

frameworks/Java/spring-webflux/pom.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
<parent>
1414
<groupId>org.springframework.boot</groupId>
1515
<artifactId>spring-boot-starter-parent</artifactId>
16-
<version>3.3.4</version>
16+
<version>3.3.5</version>
1717
</parent>
1818

1919
<properties>
2020
<java.version>21</java.version>
2121
<jstachio.version>1.3.6</jstachio.version>
22-
<r2dbc-pool.version>1.0.2.RELEASE</r2dbc-pool.version>
23-
<r2dbc-postgresql.version>1.0.7.RELEASE</r2dbc-postgresql.version>
2422
</properties>
2523

2624
<dependencies>

frameworks/Java/spring-webflux/spring-webflux-mongo.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ COPY src src
44
COPY pom.xml pom.xml
55
RUN mvn package -q
66

7-
FROM bellsoft/liberica-openjre-debian:21
7+
FROM bellsoft/liberica-openjre-debian:23
88
WORKDIR /spring
99
COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar
1010
# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html

frameworks/Java/spring-webflux/spring-webflux.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ COPY src src
44
COPY pom.xml pom.xml
55
RUN mvn package -q
66

7-
FROM bellsoft/liberica-openjre-debian:21
7+
FROM bellsoft/liberica-openjre-debian:23
88
WORKDIR /spring
99
COPY --from=maven /spring/target/spring-webflux-benchmark.jar app.jar
1010
# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html

frameworks/Java/spring-webflux/src/main/java/benchmark/repository/DbRepository.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package benchmark.repository;
22

3+
import java.util.List;
4+
35
import benchmark.model.Fortune;
46
import benchmark.model.World;
57
import reactor.core.publisher.Flux;
@@ -9,7 +11,7 @@ public interface DbRepository {
911

1012
Mono<World> getWorld(int id);
1113

12-
Mono<World> findAndUpdateWorld(int id, int randomNumber);
14+
Mono<Void> updateWorlds(List<World> worlds);
1315

1416
Flux<Fortune> fortunes();
1517
}

frameworks/Java/spring-webflux/src/main/java/benchmark/repository/MongoDbRepository.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package benchmark.repository;
22

3+
import java.util.List;
4+
35
import benchmark.model.Fortune;
46
import benchmark.model.World;
5-
import org.slf4j.Logger;
6-
import org.slf4j.LoggerFactory;
7+
78
import org.springframework.context.annotation.Profile;
89
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
910
import org.springframework.stereotype.Component;
1011
import reactor.core.publisher.Flux;
1112
import reactor.core.publisher.Mono;
1213

13-
import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
1414
import static org.springframework.data.mongodb.core.query.Criteria.where;
1515
import static org.springframework.data.mongodb.core.query.Query.query;
1616
import static org.springframework.data.mongodb.core.query.Update.update;
@@ -31,12 +31,11 @@ public Mono<World> getWorld(int id) {
3131
}
3232

3333
@Override
34-
public Mono<World> findAndUpdateWorld(int id, int randomNumber) {
35-
return operations.findAndModify(
36-
query(where("id").is(id)),
37-
update("randomNumber", randomNumber),
38-
options().returnNew(true),
39-
World.class);
34+
public Mono<Void> updateWorlds(List<World> worlds) {
35+
return Flux.fromIterable(worlds).flatMap(world -> operations.findAndModify(
36+
query(where("id").is(world.id)),
37+
update("randomNumber", world.randomnumber),
38+
World.class)).then();
4039
}
4140

4241
@Override

frameworks/Java/spring-webflux/src/main/java/benchmark/repository/R2dbcDbRepository.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package benchmark.repository;
22

3+
import java.util.List;
4+
35
import org.springframework.context.annotation.Profile;
46
import org.springframework.r2dbc.core.DatabaseClient;
57
import org.springframework.stereotype.Component;
68

79
import benchmark.model.Fortune;
810
import benchmark.model.World;
11+
import io.r2dbc.spi.Connection;
12+
import io.r2dbc.spi.ConnectionFactory;
13+
import io.r2dbc.spi.Result;
14+
import io.r2dbc.spi.Statement;
915
import reactor.core.publisher.Flux;
1016
import reactor.core.publisher.Mono;
1117

@@ -23,28 +29,25 @@ public R2dbcDbRepository(DatabaseClient databaseClient) {
2329
public Mono<World> getWorld(int id) {
2430
return databaseClient
2531
.sql("SELECT id, randomnumber FROM world WHERE id = $1")
26-
.bind("$1", id)
32+
.bind(0, id)
2733
.mapProperties(World.class)
2834
.first();
2935
}
3036

31-
private Mono<World> updateWorld(World world) {
32-
return databaseClient
33-
.sql("UPDATE world SET randomnumber=$2 WHERE id = $1")
34-
.bind("$1", world.id)
35-
.bind("$2", world.randomnumber)
36-
.fetch()
37-
.rowsUpdated()
38-
.map(count -> world);
39-
}
40-
41-
4237
@Override
43-
public Mono<World> findAndUpdateWorld(int id, int randomNumber) {
44-
return getWorld(id).flatMap(world -> {
45-
world.randomnumber = randomNumber;
46-
return updateWorld(world);
47-
});
38+
public Mono<Void> updateWorlds(List<World> worlds) {
39+
return databaseClient.inConnectionMany(con -> {
40+
Statement statement = con.createStatement("UPDATE world SET randomnumber=$2 WHERE id = $1");
41+
for (int i = 0; i < worlds.size(); i++) {
42+
World world = worlds.get(i);
43+
statement.bind(0, world.randomnumber)
44+
.bind(1, world.id);
45+
if (i < worlds.size() - 1) {
46+
statement.add();
47+
}
48+
}
49+
return Flux.from(statement.execute());
50+
}).flatMap(Result::getRowsUpdated).then();
4851
}
4952

5053
@Override

frameworks/Java/spring-webflux/src/main/java/benchmark/web/DbHandler.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package benchmark.web;
22

3+
import java.util.Comparator;
34
import java.util.List;
45

56
import benchmark.Utils;
@@ -68,8 +69,16 @@ public Mono<ServerResponse> updates(ServerRequest request) {
6869
int queries = parseQueryCount(request.queryParams().getFirst("queries"));
6970

7071
Mono<List<World>> worlds = Flux.fromStream(Utils.randomWorldNumbers().limit(queries).boxed())
71-
.flatMap(i -> dbRepository.findAndUpdateWorld(i, Utils.randomWorldNumber()))
72-
.collectList();
72+
.flatMap(id -> dbRepository.getWorld(id).map(world -> {
73+
int randomNumber;
74+
do {
75+
randomNumber = Utils.randomWorldNumber();
76+
} while (randomNumber == world.randomnumber);
77+
world.randomnumber = randomNumber;
78+
return world;
79+
}))
80+
.collectSortedList(Comparator.comparingInt(w -> w.id))
81+
.flatMap(list -> dbRepository.updateWorlds(list).thenReturn(list));
7382

7483
return ServerResponse.ok()
7584
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)

frameworks/Java/spring-webflux/src/main/resources/application.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ spring:
1717
password: ${database.password}
1818
url: r2dbc:postgresql://${database.host}:${database.port}/${database.name}?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable
1919
pool:
20-
max-size: 256
20+
max-size: 512
2121

2222
---
2323
spring:

frameworks/Java/spring/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>org.springframework.boot</groupId>
1313
<artifactId>spring-boot-starter-parent</artifactId>
14-
<version>3.3.4</version>
14+
<version>3.3.5</version>
1515
</parent>
1616

1717
<properties>

frameworks/Java/spring/spring-mongo.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ COPY src src
44
COPY pom.xml pom.xml
55
RUN mvn package -q
66

7-
FROM bellsoft/liberica-openjre-debian:21
7+
FROM bellsoft/liberica-openjre-debian:23
88
WORKDIR /spring
99
COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar
1010
# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html

0 commit comments

Comments
 (0)