diff --git a/frameworks/Java/spring/README.md b/frameworks/Java/spring/README.md
index 8e25a585d44..742649fff7e 100644
--- a/frameworks/Java/spring/README.md
+++ b/frameworks/Java/spring/README.md
@@ -2,9 +2,7 @@
This is the Spring MVC portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
-An embedded undertow is used for the web server, with nearly everything configured with default settings.
-The only thing changed is Hikari can use up to (2 * cores count) connections (the default is 10).
-See [About-Pool-Sizing](https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing)
+An embedded undertow is used for the web server.
There are two implementations :
* For postgresql access, JdbcTemplate is used. See [JdbcDbRepository](src/main/java/hello/JdbcDbRepository.java).
diff --git a/frameworks/Java/spring/benchmark_config.json b/frameworks/Java/spring/benchmark_config.json
index 615c4a478ca..72362984811 100644
--- a/frameworks/Java/spring/benchmark_config.json
+++ b/frameworks/Java/spring/benchmark_config.json
@@ -24,27 +24,6 @@
"notes": "",
"versus": ""
},
- "jpa": {
- "db_url": "/db",
- "query_url": "/queries?queries=",
- "fortune_url": "/fortunes",
- "update_url": "/updates?queries=",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Fullstack",
- "database": "Postgres",
- "framework": "spring",
- "language": "Java",
- "flavor": "None",
- "orm": "Full",
- "platform": "Servlet",
- "webserver": "Undertow",
- "os": "Linux",
- "database_os": "Linux",
- "display_name": "spring-jpa",
- "notes": "",
- "versus": "spring"
- },
"mongo": {
"db_url": "/db",
"query_url": "/queries?queries=",
diff --git a/frameworks/Java/spring/pom.xml b/frameworks/Java/spring/pom.xml
index 4a8d36e9749..6c9341fed54 100644
--- a/frameworks/Java/spring/pom.xml
+++ b/frameworks/Java/spring/pom.xml
@@ -11,11 +11,12 @@
org.springframework.boot
spring-boot-starter-parent
- 3.3.3
+ 3.3.4
21
+ 1.3.6
@@ -35,15 +36,23 @@
org.springframework.boot
- spring-boot-starter-data-jpa
+ spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-data-mongodb
- org.springframework.boot
- spring-boot-starter-mustache
+ io.jstach
+ jstachio
+ ${jstachio.version}
+
+
+ io.jstach
+ jstachio-apt
+ ${jstachio.version}
+ provided
+ true
@@ -61,6 +70,15 @@
org.apache.maven.plugins
maven-compiler-plugin
+
+
+
+ io.jstach
+ jstachio-apt
+ ${jstachio.version}
+
+
+
diff --git a/frameworks/Java/spring/spring-jpa.dockerfile b/frameworks/Java/spring/spring-jpa.dockerfile
deleted file mode 100644
index 0598e9c1f28..00000000000
--- a/frameworks/Java/spring/spring-jpa.dockerfile
+++ /dev/null
@@ -1,15 +0,0 @@
-FROM maven:3.9.5-eclipse-temurin-21 as maven
-WORKDIR /spring
-COPY src src
-COPY pom.xml pom.xml
-RUN mvn package -q
-
-FROM bellsoft/liberica-openjre-debian:21
-WORKDIR /spring
-COPY --from=maven /spring/target/hello-spring-1.0-SNAPSHOT.jar app.jar
-# See https://docs.spring.io/spring-boot/reference/packaging/efficient.html
-RUN java -Djarmode=tools -jar app.jar extract
-
-EXPOSE 8080
-
-CMD ["java", "-XX:+DisableExplicitGC", "-XX:+UseStringDeduplication", "-Dlogging.level.root=OFF", "-jar", "app/app.jar", "--spring.profiles.active=jpa"]
\ No newline at end of file
diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java
index 0484b46517e..da87b679f87 100644
--- a/frameworks/Java/spring/src/main/java/hello/App.java
+++ b/frameworks/Java/spring/src/main/java/hello/App.java
@@ -1,17 +1,10 @@
package hello;
-import javax.sql.DataSource;
-
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Profile;
import org.springframework.context.event.EventListener;
-import com.zaxxer.hikari.HikariDataSource;
-
@SpringBootApplication
public class App {
@@ -20,18 +13,8 @@ public static void main(String[] args) {
}
@EventListener(ApplicationReadyEvent.class)
- public void runAfterStartup() {
- System.out.println("Application is ready");
- }
-
- @Bean
- @Profile({ "jdbc", "jpa" })
- DataSource datasource(DataSourceProperties dataSourceProperties) {
- HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class)
- .build();
- dataSource.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 2);
-
- return dataSource;
+ public void runAfterStartup() {
+ System.out.println("Application is ready");
}
}
diff --git a/frameworks/Java/spring/src/main/java/hello/JpaConfig.java b/frameworks/Java/spring/src/main/java/hello/JpaConfig.java
deleted file mode 100644
index c5b8576acab..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/JpaConfig.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package hello;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-
-@Profile("jpa")
-@Configuration
-@EnableJpaRepositories(basePackages = "hello.jpa")
-public class JpaConfig {
-
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java
deleted file mode 100644
index 11c6568c076..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/UpdateWorldService.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package hello;
-
-import hello.model.World;
-
-public interface UpdateWorldService {
-
- World updateWorld(int worldId);
-
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java b/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java
deleted file mode 100644
index 2bd4304a9ee..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/UpdateWorldServiceImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package hello;
-
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import hello.web.DbHandler;
-import hello.web.WebmvcRouter;
-import hello.model.World;
-import hello.repository.DbRepository;
-
-@Service
-public class UpdateWorldServiceImpl implements UpdateWorldService {
-
- private DbRepository dbRepository;
-
- public UpdateWorldServiceImpl(DbRepository dbRepository) {
- this.dbRepository = dbRepository;
- }
-
- @Override
- @Transactional
- public World updateWorld(int worldId) {
- var world = dbRepository.getWorld(worldId);
- // Ensure that the new random number is not equal to the old one.
- // That would cause the JPA-based implementation to avoid sending the
- // UPDATE query to the database, which would violate the test
- // requirements.
-
- // Locally the records doesn't exist, maybe in the yours is ok but we need to
- // make this check
- if (world == null) {
- return null;
- }
-
- int newRandomNumber;
- do {
- newRandomNumber = DbHandler.randomWorldNumber();
- } while (newRandomNumber == world.randomnumber);
-
- return dbRepository.updateWorld(world, newRandomNumber);
- }
-
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/Utils.java b/frameworks/Java/spring/src/main/java/hello/Utils.java
new file mode 100644
index 00000000000..fbb1216624f
--- /dev/null
+++ b/frameworks/Java/spring/src/main/java/hello/Utils.java
@@ -0,0 +1,19 @@
+package hello;
+
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.IntStream;
+
+abstract public class Utils {
+
+ private static final int MIN_WORLD_NUMBER = 1;
+ private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001;
+
+ public static int randomWorldNumber() {
+ return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE);
+ }
+
+ public static IntStream randomWorldNumbers() {
+ return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE).distinct();
+ }
+
+}
diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java
deleted file mode 100644
index 30dea98cc27..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/jpa/FortuneRepository.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package hello.jpa;
-
-import org.springframework.context.annotation.Profile;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import hello.model.Fortune;
-
-@Repository
-@Profile("jpa")
-public interface FortuneRepository extends JpaRepository {
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java
deleted file mode 100644
index 2b58841a035..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/jpa/JpaDbRepository.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package hello.jpa;
-
-import java.util.List;
-
-import org.springframework.context.annotation.Profile;
-import org.springframework.stereotype.Service;
-
-import hello.model.Fortune;
-import hello.model.World;
-import hello.repository.DbRepository;
-
-@Service
-@Profile("jpa")
-public class JpaDbRepository implements DbRepository {
- private final WorldRepository worldRepository;
- private final FortuneRepository fortuneRepository;
-
- public JpaDbRepository(WorldRepository worldRepository, FortuneRepository fortuneRepository) {
- this.worldRepository = worldRepository;
- this.fortuneRepository = fortuneRepository;
- }
-
- @Override
- public World getWorld(int id) {
- return worldRepository.findById(id).orElse(null);
- }
-
- @Override
- public World updateWorld(World world, int randomNumber) {
- world.randomnumber = randomNumber;
- return worldRepository.save(world);
- }
-
- @Override
- public List fortunes() {
- return fortuneRepository.findAll();
- }
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java b/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java
deleted file mode 100644
index 70361aa40d6..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/jpa/WorldRepository.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package hello.jpa;
-
-import org.springframework.context.annotation.Profile;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import hello.model.World;
-
-@Repository
-@Profile("jpa")
-public interface WorldRepository extends JpaRepository {
-}
diff --git a/frameworks/Java/spring/src/main/java/hello/model/Fortune.java b/frameworks/Java/spring/src/main/java/hello/model/Fortune.java
index e4ff559610a..a628d3c755f 100644
--- a/frameworks/Java/spring/src/main/java/hello/model/Fortune.java
+++ b/frameworks/Java/spring/src/main/java/hello/model/Fortune.java
@@ -1,33 +1,25 @@
package hello.model;
-import jakarta.persistence.Entity;
-
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document
-@Entity
-public final class Fortune {
+public final class Fortune implements Comparable{
+
@Id
- @jakarta.persistence.Id
- public int id;
- @Field("message")
- public String message;
+ public final int id;
- protected Fortune() {
- }
+ @Field("message")
+ public final String message;
public Fortune(int id, String message) {
this.id = id;
this.message = message;
}
- public int getId() {
- return id;
- }
-
- public String getMessage() {
- return message;
+ @Override
+ public int compareTo(final Fortune other) {
+ return message.compareTo(other.message);
}
-}
\ No newline at end of file
+}
diff --git a/frameworks/Java/spring/src/main/java/hello/model/Message.java b/frameworks/Java/spring/src/main/java/hello/model/Message.java
deleted file mode 100644
index 4c675c8a162..00000000000
--- a/frameworks/Java/spring/src/main/java/hello/model/Message.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package hello.model;
-
-public class Message {
-
- private final String message;
-
- public Message(String message) {
- this.message = message;
- }
-
- public String getMessage() {
- return message;
- }
-
-}
\ No newline at end of file
diff --git a/frameworks/Java/spring/src/main/java/hello/model/World.java b/frameworks/Java/spring/src/main/java/hello/model/World.java
index 2855df8a5d8..762e9e622ce 100644
--- a/frameworks/Java/spring/src/main/java/hello/model/World.java
+++ b/frameworks/Java/spring/src/main/java/hello/model/World.java
@@ -1,26 +1,22 @@
package hello.model;
-import jakarta.persistence.Entity;
-
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document
-@Entity
public final class World {
@Id
- @jakarta.persistence.Id
public int id;
+
@Field("randomNumber")
- public int randomnumber;
+ public int randomNumber;
- protected World() {
- }
- public World(int id, int randomnumber) {
+ public World(int id, int randomNumber) {
this.id = id;
- this.randomnumber = randomnumber;
+ this.randomNumber = randomNumber;
}
+
}
\ No newline at end of file
diff --git a/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java
index 5cfa8c7d5c3..d7733754c2c 100644
--- a/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java
+++ b/frameworks/Java/spring/src/main/java/hello/repository/DbRepository.java
@@ -6,9 +6,10 @@
import hello.model.World;
public interface DbRepository {
+
World getWorld(int id);
- World updateWorld(World world, int randomNumber);
+ void updateWorlds(List worlds);
List fortunes();
}
diff --git a/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java
index f1dcdae0352..c7da5f4f1c9 100644
--- a/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java
+++ b/frameworks/Java/spring/src/main/java/hello/repository/JdbcDbRepository.java
@@ -1,10 +1,15 @@
package hello.repository;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Profile;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
import org.springframework.stereotype.Repository;
import hello.model.Fortune;
@@ -22,27 +27,34 @@ public JdbcDbRepository(JdbcTemplate jdbcTemplate) {
@Override
public World getWorld(int id) {
try {
- return jdbcTemplate.queryForObject("SELECT * FROM world WHERE id = ?",
- (rs, rn) -> new World(rs.getInt("id"), rs.getInt("randomnumber")), id);
+ return jdbcTemplate.queryForObject("SELECT id, randomnumber FROM world WHERE id = ?",
+ (rs, rn) -> new World(rs.getInt(1), rs.getInt(2)), id);
} catch (EmptyResultDataAccessException e) {
return null;
}
}
- private World updateWorld(World world) {
- jdbcTemplate.update("UPDATE world SET randomnumber = ? WHERE id = ?", world.randomnumber, world.id);
- return world;
- }
-
@Override
- public World updateWorld(World world, int randomNumber) {
- world.randomnumber = randomNumber;
- return updateWorld(world);
+ public void updateWorlds(List worlds) {
+ jdbcTemplate.batchUpdate("UPDATE world SET randomnumber = ? WHERE id = ?", worlds, worlds.size(), new ParameterizedPreparedStatementSetter() {
+ @Override
+ public void setValues(PreparedStatement ps, World world) throws SQLException {
+ ps.setInt(1, world.id);
+ ps.setInt(2, world.randomNumber);
+ }
+ });
}
@Override
public List fortunes() {
- return jdbcTemplate.query("SELECT * FROM fortune",
- (rs, rn) -> new Fortune(rs.getInt("id"), rs.getString("message")));
+ return jdbcTemplate.query(con -> con.prepareStatement("SELECT id, message FROM fortune",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY), rs -> {
+ List results = new ArrayList<>();
+ while (rs.next()) {
+ results.add(new Fortune(rs.getInt(1), rs.getString(2)));
+ }
+ return results;
+ });
}
+
}
diff --git a/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java b/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java
index 66c81e64f1d..9b6b67c4c95 100644
--- a/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java
+++ b/frameworks/Java/spring/src/main/java/hello/repository/MongoDbRepository.java
@@ -1,11 +1,18 @@
package hello.repository;
+import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Profile;
+import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
+import com.mongodb.bulk.BulkWriteResult;
+import hello.Utils;
import hello.model.Fortune;
import hello.model.World;
@@ -24,9 +31,14 @@ public World getWorld(int id) {
}
@Override
- public World updateWorld(World world, int randomNumber) {
- world.randomnumber = randomNumber;
- return mongoTemplate.save(world);
+ public void updateWorlds(List worlds) {
+ BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, World.class);
+ for (World world : worlds) {
+ Query query = new Query().addCriteria(new Criteria("_id").is(world.id));
+ Update update = new Update().set("randomNumber", world.randomNumber);
+ bulkOps.updateOne(query, update);
+ }
+ bulkOps.execute();
}
@Override
diff --git a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java
index 1611cf21170..affb752268f 100644
--- a/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java
+++ b/frameworks/Java/spring/src/main/java/hello/web/DbHandler.java
@@ -1,83 +1,71 @@
package hello.web;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.stream.IntStream;
+import java.util.Collections;
+import java.util.List;
-import hello.UpdateWorldService;
+import hello.Utils;
import hello.model.Fortune;
import hello.model.World;
import hello.repository.DbRepository;
+import io.jstach.jstachio.JStachio;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.function.RenderingResponse;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;
-import static java.util.Comparator.comparing;
-
@Component
public class DbHandler {
- private DbRepository dbRepository;
- private UpdateWorldService updateWorldService;
+ private final DbRepository dbRepository;
- public DbHandler(DbRepository dbRepository, UpdateWorldService updateWorldService) {
+ public DbHandler(DbRepository dbRepository) {
this.dbRepository = dbRepository;
- this.updateWorldService = updateWorldService;
}
ServerResponse db(ServerRequest request) {
return ServerResponse.ok()
- .contentType(MediaType.APPLICATION_JSON)
- .body(dbRepository.getWorld(randomWorldNumber()));
+ .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
+ .body(dbRepository.getWorld(Utils.randomWorldNumber()));
}
ServerResponse queries(ServerRequest request) {
- String queries = request.params().getFirst("queries");
- World[] worlds = randomWorldNumbers()
- .mapToObj(dbRepository::getWorld).limit(parseQueryCount(queries))
+ int queries = parseQueryCount(request.params().getFirst("queries"));
+ World[] worlds = Utils.randomWorldNumbers()
+ .mapToObj(dbRepository::getWorld).limit(queries)
.toArray(World[]::new);
return ServerResponse.ok()
- .contentType(MediaType.APPLICATION_JSON)
+ .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.body(worlds);
}
ServerResponse updates(ServerRequest request) {
- String queries = request.params().getFirst("queries");
- World[] worlds = randomWorldNumbers()
- .mapToObj(id -> updateWorldService.updateWorld(id))
- .limit(parseQueryCount(queries)).toArray(World[]::new);
+ int queries = parseQueryCount(request.params().getFirst("queries"));
+ List worlds = Utils.randomWorldNumbers()
+ .mapToObj(id -> {
+ World world = dbRepository.getWorld(id);
+ int randomNumber;
+ do {
+ randomNumber = Utils.randomWorldNumber();
+ } while (randomNumber == world.randomNumber);
+ world.randomNumber = randomNumber;
+ return world;
+ }).limit(queries)
+ .toList();
+ dbRepository.updateWorlds(worlds);
return ServerResponse.ok()
- .contentType(MediaType.APPLICATION_JSON)
+ .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.body(worlds);
}
ServerResponse fortunes(ServerRequest request) {
- var fortunes = dbRepository.fortunes();
+ List fortunes = dbRepository.fortunes();
fortunes.add(new Fortune(0, "Additional fortune added at request time."));
- fortunes.sort(comparing(fortune -> fortune.message));
- return RenderingResponse
- .create("fortunes")
- .modelAttribute("fortunes", fortunes)
+ Collections.sort(fortunes);
+ return ServerResponse.ok()
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE)
- .build();
- }
-
- private static final int MIN_WORLD_NUMBER = 1;
- private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001;
-
- public static int randomWorldNumber() {
- return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE);
- }
-
- private static IntStream randomWorldNumbers() {
- return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE)
- // distinct() allows us to avoid using Hibernate's first-level cache in
- // the JPA-based implementation. Using a cache like that would bypass
- // querying the database, which would violate the test requirements.
- .distinct();
+ .body(JStachio.render(new Fortunes(fortunes)));
}
private static int parseQueryCount(String textValue) {
diff --git a/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java b/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java
new file mode 100644
index 00000000000..cbd6daf2396
--- /dev/null
+++ b/frameworks/Java/spring/src/main/java/hello/web/Fortunes.java
@@ -0,0 +1,10 @@
+package hello.web;
+
+import java.util.List;
+
+import hello.model.Fortune;
+import io.jstach.jstache.JStache;
+
+@JStache(path = "fortunes.mustache")
+public record Fortunes(List fortunes) {
+}
diff --git a/frameworks/Java/spring/src/main/resources/application.yml b/frameworks/Java/spring/src/main/resources/application.yml
index 4f6592dc53b..cc4bc23184b 100644
--- a/frameworks/Java/spring/src/main/resources/application.yml
+++ b/frameworks/Java/spring/src/main/resources/application.yml
@@ -1,21 +1,21 @@
+server:
+ server-header: Spring
+ servlet:
+ encoding:
+ force: true
---
spring:
config:
activate:
on-profile: jdbc
autoconfigure:
- exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
-
----
-spring:
- config:
- activate:
- on-profile: jdbc,jpa
+ exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
datasource:
- url: jdbc:postgresql://${database.host}:${database.port}/${database.name}
+ url: jdbc:postgresql://${database.host}:${database.port}/${database.name}?sslmode=loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable
username: ${database.username}
password: ${database.password}
-
+ hikari:
+ maximum-pool-size: 256
database:
name: hello_world
host: tfb-database
@@ -23,23 +23,13 @@ database:
username: benchmarkdbuser
password: benchmarkdbpass
----
-spring:
- config:
- activate:
- on-profile: jpa
- autoconfigure:
- exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
- jpa:
- database-platform: org.hibernate.dialect.PostgreSQLDialect
-
---
spring:
config:
activate:
on-profile: mongo
autoconfigure:
- exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
+ exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
spring.data.mongodb:
host: tfb-database
@@ -50,7 +40,3 @@ spring.data.mongodb:
spring:
profiles:
active: jdbc
-
-server.server-header: Spring
-server.servlet.encoding.force: true
-spring.jpa.open-in-view: false
diff --git a/frameworks/Java/spring/src/main/resources/templates/fortunes.mustache b/frameworks/Java/spring/src/main/resources/fortunes.mustache
similarity index 100%
rename from frameworks/Java/spring/src/main/resources/templates/fortunes.mustache
rename to frameworks/Java/spring/src/main/resources/fortunes.mustache