diff --git a/frameworks/Java/tadx/README.cn.md b/frameworks/Java/tadx/README.cn.md new file mode 100644 index 00000000000..e099c71564f --- /dev/null +++ b/frameworks/Java/tadx/README.cn.md @@ -0,0 +1,108 @@ +# Tad.x (tadx) 基准测试 + +## 项目概述 +Tad.x 是一个用于基准测试的 Java Web 框架项目,是 [FrameworkBenchmarks](https://github.com/TechEmpower/FrameworkBenchmarks) 的一部分,主要用于测试不同 Web 框架的性能表现。 + +## 技术栈 +- **Java 21**:项目的主要开发语言 +- **Spring Boot**:当前使用的主要框架(从代码中可以看到之前可能使用过 Vert.x,现已注释) +- **Vert.x**:用于异步事件处理和数据库操作 +- **PostgreSQL**:基准测试使用的数据库 +- **Thymeleaf & FreeMarker**:模板引擎,用于Fortunes测试 +- **Gradle**:项目构建工具 + +## 项目结构 +```yaml +tadx/ +├── src/main/java/io/tadx/benchmark/ +│ ├── Application.java # Project entry point +│ ├── controller/ # Controller classes +│ ├── entity/ # Database entity classes +│ └── route_mapper/ # Route mapping implementations +├── src/main/resources/ # Resource files +│ ├── application.yaml # Configuration file +│ └── templates/ # Template files +├── build.gradle # Gradle build configuration +├── settings.gradle # Gradle settings +└── tadx.dockerfile # Docker deployment configuration +``` + +## 核心功能 +项目实现了以下基准测试类型: + +| 测试类型 | 路由 | 实现类 | 功能描述 | +|---------|------|-------|----------| +| JSON | /json | JsonRouteMapper.java | 返回简单JSON响应 | +| 文本 | /plaintext | PlainTextRouteMapper.java | 返回简单文本响应 | +| 数据库 | /db | DbRouteMapper_Postgresql.java | 单条数据库查询 | +| 多查询 | /query | QueriesRouteMapper1_Postgresql.java | 多条数据库查询 | +| 缓存查询 | /cached_query | CachedQueriesMapper3.java | 缓存查询结果 | +| 更新 | /update | UpdateMapper.java | 数据库更新操作 | +| 幸运饼干 | /fortunes | FortunesRouteMapper1.java | 模板渲染测试 | + +## 实现特点 + +### 路由机制 +- 使用自定义的 `@RouteMapping` 注解定义路由 +- 每个测试类型对应一个 `RouteMapper` 接口实现 +- 路由处理直接操作 Vert.x 的响应对象,减少中间层开销 + +### 数据库操作 +- 使用 Vert.x 的 PostgreSQL 客户端进行异步数据库操作 +- 配置了数据库连接池,最大连接数为 2000 +- 支持 prepared statements 缓存,提高性能 +- 定义了 `World` 和 `Fortune` 两个实体类映射数据库表 + +### 性能优化 +- 直接设置 HTTP 响应头和状态码,减少框架开销 +- 使用预编译语句和连接池提高数据库性能 +- 缓存常用的响应头和日期字符串 + +## 运行方式 +1. **直接运行**:通过 `Application.java` 的 main 方法启动 Spring Boot 应用 +2. **构建运行**:使用 Gradle 构建 JAR 文件后运行 +3. **Docker部署**:使用提供的 tadx.dockerfile 构建镜像并运行 + +## 配置文件 +- `application.yaml`:Spring Boot 应用配置 +- `benchmark_config.json`:基准测试配置 + +## 测试类型实现源代码 + +* [JSON](src/main/java/io/tadx/benchmark/route_mapper/JsonRouteMapper.java) +* [PLAINTEXT](src/main/java/io/tadx/benchmark/route_mapper/PlainTextRouteMapper.java) +* [DB](src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java) +* [QUERY](src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java) +* [CACHED QUERY](src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java) +* [UPDATE](src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java) +* [FORTUNES](src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java) + + +## 测试URLs +### JSON + +http://localhost:8000/json + +### PLAINTEXT + +http://localhost:8000/plaintext + +### DB + +http://localhost:8000/db + +### QUERY + +http://localhost:8000/query?queries= + +### CACHED QUERY + +http://localhost:8000/cached_query?queries= + +### UPDATE + +http://localhost:8000/update?queries= + +### FORTUNES + +http://localhost:8000/fortunes diff --git a/frameworks/Java/tadx/README.en.md b/frameworks/Java/tadx/README.en.md new file mode 100644 index 00000000000..585637f6828 --- /dev/null +++ b/frameworks/Java/tadx/README.en.md @@ -0,0 +1,111 @@ +# Tad.x (tadx) Benchmarking Test + +## Project Overview +Tad.x is a Java web framework project for benchmarking, part of the [FrameworkBenchmarks](https://github.com/TechEmpower/FrameworkBenchmarks) project, designed to test the performance of different web frameworks. + +## Technology Stack +- **Java 21**: The primary development language +- **Spring Boot**: The main framework currently used (previously used Vert.x, now commented out) +- **Vert.x**: For asynchronous event handling and database operations +- **PostgreSQL**: Database used for benchmarking +- **Thymeleaf & FreeMarker**: Template engines for the Fortunes test +- **Gradle**: Project build tool + +## Project Structure +```yaml +tadx/ +├── src/main/java/io/tadx/benchmark/ +│ ├── Application.java # Project entry point +│ ├── controller/ # Controller classes +│ ├── entity/ # Database entity classes +│ └── route_mapper/ # Route mapping implementations +├── src/main/resources/ # Resource files +│ ├── application.yaml # Configuration file +│ └── templates/ # Template files +├── build.gradle # Gradle build configuration +├── settings.gradle # Gradle settings +└── tadx.dockerfile # Docker deployment configuration +``` + + +plainText + +## Core Features +The project implements the following benchmark test types: + +| Test Type | Route | Implementation Class | Description | +|---------|------|-------|----------| +| JSON | /json | JsonRouteMapper.java | Returns a simple JSON response | +| PLAINTEXT | /plaintext | PlainTextRouteMapper.java | Returns a simple text response | +| DB | /db | DbRouteMapper_Postgresql.java | Single database query | +| QUERY | /query | QueriesRouteMapper1_Postgresql.java | Multiple database queries | +| CACHED QUERY | /cached_query | CachedQueriesMapper3.java | Caches query results | +| UPDATE | /update | UpdateMapper.java | Database update operations | +| FORTUNES | /fortunes | FortunesRouteMapper1.java | Template rendering test | + +## Implementation Features + +### Routing Mechanism +- Uses custom `@RouteMapping` annotation to define routes +- Each test type corresponds to a `RouteMapper` interface implementation +- Route handling directly manipulates Vert.x response objects to reduce overhead + +### Database Operations +- Uses Vert.x PostgreSQL client for asynchronous database operations +- Configures database connection pool with maximum 2000 connections +- Supports prepared statements caching for improved performance +- Defines `World` and `Fortune` entity classes mapping to database tables + +### Performance Optimization +- Directly sets HTTP response headers and status codes to reduce framework overhead +- Uses precompiled statements and connection pooling to improve database performance +- Caches commonly used response headers and date strings + +## Running Methods +1. **Direct Run**: Start the Spring Boot application through the main method in `Application.java` +2. **Build and Run**: Build JAR file using Gradle and run it +3. **Docker Deployment**: Build image using the provided tadx.dockerfile and run it + +## Configuration Files +- `application.yaml`: Spring Boot application configuration +- `benchmark_config.json`: Benchmark configuration + +## Test Type Implementation Source Code + +* [JSON](src/main/java/io/tadx/benchmark/route_mapper/JsonRouteMapper.java) +* [PLAINTEXT](src/main/java/io/tadx/benchmark/route_mapper/PlainTextRouteMapper.java) +* [DB](src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java) +* [QUERY](src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java) +* [CACHED QUERY](src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java) +* [UPDATE](src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java) +* [FORTUNES](src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java) + + +## Test URLs +### JSON + +http://localhost:8000/json + +### PLAINTEXT + +http://localhost:8000/plaintext + +### DB + +http://localhost:8000/db + +### QUERY + +http://localhost:8000/query?queries= + +### CACHED QUERY + +http://localhost:8000/cached_query?queries= + +### UPDATE + +http://localhost:8000/update?queries= + +### FORTUNES + +http://localhost:8000/fortunes \ No newline at end of file diff --git a/frameworks/Java/tadx/README.md b/frameworks/Java/tadx/README.md index 6da1dd4ab1f..26236b975c2 100644 --- a/frameworks/Java/tadx/README.md +++ b/frameworks/Java/tadx/README.md @@ -1,42 +1,11 @@ -# Tad.x (tadx) Benchmarking Test +# Tad.x (tadx) Benchmarking Test / Tad.x (tadx) 基准测试 -### Test Type Implementation Source Code +## Project Overview / 项目概述 +Tad.x is a Java web framework project for benchmarking, part of the [FrameworkBenchmarks](https://github.com/TechEmpower/FrameworkBenchmarks) project, designed to test the performance of different web frameworks. -* [JSON](src/main/java/io/tadx/benchmark/route_mapper/JsonRouteMapper.java) -* [PLAINTEXT](src/main/java/io/tadx/benchmark/route_mapper/PlainTextRouteMapper.java) -* [DB](src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java) -* [QUERY](src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java) -* [CACHED QUERY](src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java) -* [UPDATE](src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java) -* [FORTUNES](src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java) +Tad.x 是一个用于基准测试的 Java Web 框架项目,是 [FrameworkBenchmarks](https://github.com/TechEmpower/FrameworkBenchmarks) 的一部分,主要用于测试不同 Web 框架的性能表现。 - -## Test URLs -### JSON - -http://localhost:8000/json - -### PLAINTEXT - -http://localhost:8000/plaintext - -### DB - -http://localhost:8000/db - -### QUERY - -http://localhost:8000/query?queries= - -### CACHED QUERY - -http://localhost:8000/cached_query?queries= - -### UPDATE - -http://localhost:8000/update?queries= - -### FORTUNES - -http://localhost:8000/fortunes +## Detailed Documentation / 详细文档 +- [English Version](README.en.md) / [英文版本](README.en.md) +- [Chinese Version](README.cn.md) / [中文版本](README.cn.md) diff --git a/frameworks/Java/tadx/benchmark_config.json b/frameworks/Java/tadx/benchmark_config.json index 13cdb62e46e..3a2cd6644df 100644 --- a/frameworks/Java/tadx/benchmark_config.json +++ b/frameworks/Java/tadx/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "tadx", + "maintainers": ["yn-tadpole"], "tests": [ { "default": { @@ -10,21 +11,21 @@ "fortune_url": "/fortunes", "update_url": "/update?queries=", "cached_query_url" : "/cached_queries?count=", - "port": 8000, + "port": 8080, "approach": "Realistic", "classification": "Fullstack", "database": "Postgres", - "framework": "tadx", + "framework": "Tad.x", "language": "Java", "flavor": "None", "orm": "Micro", - "platform": "None", + "platform": "Tad.x", "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "tadx", "notes": "", - "versus": "None" + "versus": "" } } ] diff --git a/frameworks/Java/tadx/build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar b/frameworks/Java/tadx/build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar index fcad57f2d7f..d54b8cfb1d9 100644 Binary files a/frameworks/Java/tadx/build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar and b/frameworks/Java/tadx/build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar differ diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/CachedQueries.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/CachedQueries.java index 9e3892dd733..540545f8f43 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/CachedQueries.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/CachedQueries.java @@ -4,6 +4,7 @@ import io.tadx.data.DbStorage; import io.tadx.web.HttpMethod; import io.tadx.web.annotation.*; +import io.vertx.sqlclient.Tuple; import java.util.SplittableRandom; import java.util.concurrent.ConcurrentHashMap; @@ -36,7 +37,7 @@ public World[] execute(int count) { World[] worlds = new World[count]; for (int i = 0; i < count; i++) { int id = randomWorld(); - worlds[i] = cache.computeIfAbsent(id, k -> dbStorage.findEntity(World.class, id)); + worlds[i] = cache.computeIfAbsent(id, k -> dbStorage.findEntity(World.class, Tuple.of(id))); } return worlds; } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db1.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db1.java index 763daabc77a..2c15bd6a31e 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db1.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db1.java @@ -7,6 +7,7 @@ import io.tadx.web.annotation.*; import io.vertx.core.Future; import io.vertx.core.Promise; +import io.vertx.sqlclient.Tuple; import java.util.SplittableRandom; @@ -28,14 +29,14 @@ public Db1(DbStorage dbStorage) { //@RestFunction(method = HttpMethod.GET) public Future execute() { Promise promise = Promise.promise(); - World world = dbStorage.findEntity(World.class, randomWorld()); + World world = dbStorage.findEntity(World.class, Tuple.of(randomWorld())); promise.complete(world); return promise.future(); } @RestFunction(method = HttpMethod.GET) public DataMap executeSQL() { - return dbStorage.queryRow("SELECT id, randomnumber FROM world WHERE id = ?", randomWorld()); + return dbStorage.queryRow("SELECT id, randomnumber FROM world WHERE id = ?", Tuple.of(randomWorld())); } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db2.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db2.java index 697d6ba3816..78306a5b56d 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db2.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db2.java @@ -1,15 +1,12 @@ package io.tadx.benchmark.controller; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.web.HttpMethod; import io.tadx.web.annotation.RestController; import io.tadx.web.annotation.RestFunction; import io.vertx.core.Future; import io.vertx.core.Promise; -import io.vertx.core.json.JsonObject; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; import io.vertx.sqlclient.*; import java.util.SplittableRandom; @@ -18,23 +15,14 @@ * EN: The entry point of the application. */ -@RestController(mapping = "/db_rest_reactive") +@RestController(mapping = "/db2") public class Db2 { private static final SplittableRandom RANDOM = new SplittableRandom(); private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; private final PreparedQuery> SELECT_WORLD_QUERY; public Db2() { - PgConnectOptions connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - PoolOptions poolOptions = new PoolOptions().setMaxSize(2000); - SqlClient client = PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + SqlClient client = PgConnPool.client(); SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db3.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db3.java new file mode 100644 index 00000000000..d05836687b5 --- /dev/null +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Db3.java @@ -0,0 +1,44 @@ +package io.tadx.benchmark.controller; + +import io.tadx.benchmark.db.PgConnPool; +import io.tadx.benchmark.entity.World; +import io.tadx.core.utils.AsyncUtils; +import io.tadx.web.HttpMethod; +import io.tadx.web.annotation.RestController; +import io.tadx.web.annotation.RestFunction; +import io.vertx.sqlclient.*; + +import java.util.SplittableRandom; + +/** + * EN: The entry point of the application. + */ + +@RestController(mapping = "/db3") +public class Db3 { + private static final SplittableRandom RANDOM = new SplittableRandom(); + private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; + private final PreparedQuery> SELECT_WORLD_QUERY; + + public Db3() { + + SqlClient client = PgConnPool.client(); + SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); + } + + @RestFunction(method = HttpMethod.GET) + public World execute() { + RowSet rowSet = AsyncUtils.await(SELECT_WORLD_QUERY.execute(Tuple.of(randomWorld()))); + Row row = rowSet.iterator().next(); + World world = new World(); + world.id = row.getInteger("id"); + world.randomnumber = row.getInteger("randomnumber"); + return world; + } + + + static int randomWorld() { + return 1 + RANDOM.nextInt(10000); + } + +} diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Fortunes.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Fortunes.java index d2410a1f1a3..efc5910c91f 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Fortunes.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Fortunes.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.SplittableRandom; /** @@ -27,7 +28,7 @@ public Fortunes(DbStorage dbStorage) { @RestFunction(mapping = "/fortunes_2", method = HttpMethod.GET) public WebResult execute() { - ArrayList fortunes = dbStorage.queryEntityList(Fortune.class); + List fortunes = dbStorage.queryEntityList(Fortune.class); fortunes.addFirst(new Fortune(0, "Additional fortune added at request time.")); Collections.sort(fortunes); return WebResult.pageResult(FreemarkerEngine.class, "/templates/Fortunes_freemarker.htm"); diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Queries.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Queries.java index c4b6438e22e..cd53839d46a 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Queries.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Queries.java @@ -4,6 +4,7 @@ import io.tadx.data.DbStorage; import io.tadx.web.HttpMethod; import io.tadx.web.annotation.*; +import io.vertx.sqlclient.Tuple; import java.util.SplittableRandom; @@ -31,7 +32,7 @@ public World[] execute(int queries) { } World[] worlds = new World[queries]; for (int i = 0; i < queries; i++) { - worlds[i] = dbStorage.findEntity(World.class, randomWorld()); + worlds[i] = dbStorage.findEntity(World.class, Tuple.of(randomWorld())); } return worlds; } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Update.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Update.java index 3d5f1142b65..18b371b5b7d 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Update.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/controller/Update.java @@ -4,6 +4,7 @@ import io.tadx.data.DbStorage; import io.tadx.web.HttpMethod; import io.tadx.web.annotation.*; +import io.vertx.sqlclient.Tuple; import java.util.SplittableRandom; @@ -32,9 +33,9 @@ public World[] execute(int queries) { World[] worlds = new World[queries]; //ArrayList updates = new ArrayList<>(); for (int i = 0; i < queries; i++) { - worlds[i] = dbStorage.findEntity(World.class, randomWorld()); + worlds[i] = dbStorage.findEntity(World.class, Tuple.of(randomWorld())); //updates.add(DataMap.createNew().put("id", worlds[i].id).put("randomnumber", randomWorld())); - dbStorage.execute("update world set randomnumber=? where id=?", randomWorld(), worlds[i].id); + dbStorage.execute("update world set randomnumber=? where id=?", Tuple.of(randomWorld(), worlds[i].id)); } //dbStorage.executeBatch("update world set randomnumber={randomnumber} where id={id}", updates); diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/db/PgConnPool.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/db/PgConnPool.java new file mode 100644 index 00000000000..80f4d7172f0 --- /dev/null +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/db/PgConnPool.java @@ -0,0 +1,36 @@ +package io.tadx.benchmark.db; + +import io.tadx.core.TadxApplication; +import io.vertx.pgclient.PgBuilder; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.sqlclient.PoolOptions; +import io.vertx.sqlclient.impl.SqlClientInternal; + +public class PgConnPool { + + private static SqlClientInternal client; + + public static SqlClientInternal client() { + if (client == null) { + createClient(); + } + return client; + } + + private static synchronized void createClient() { + if (client != null) { + return; + } + PgConnectOptions connectOptions = new PgConnectOptions(). + setPort(5432).setHost("tfb-database"). + setDatabase("hello_world"). + setUser("benchmarkdbuser"). + setPassword("benchmarkdbpass"). + setCachePreparedStatements(true). + setPreparedStatementCacheMaxSize(1024). + setPipeliningLimit(100000); + PoolOptions poolOptions = new PoolOptions().setMaxSize(1900); + // Create the client pool + client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + } +} diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper1.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper1.java index e5533e5829e..f94cb31e03f 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper1.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper1.java @@ -1,15 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -29,26 +26,14 @@ public class CachedQueriesMapper1 implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD"; private final static ConcurrentHashMap cache = new ConcurrentHashMap<>(); public CachedQueriesMapper1() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); AtomicInteger key = new AtomicInteger(); diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper2.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper2.java index fdee9475135..257eacd8136 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper2.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper2.java @@ -1,15 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -29,26 +26,15 @@ public class CachedQueriesMapper2 implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD"; private final static HashMap cache = new HashMap<>(); public CachedQueriesMapper2() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); + // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); AtomicInteger key = new AtomicInteger(); diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java index 66631798c52..503a88922a4 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/CachedQueriesMapper3.java @@ -2,16 +2,13 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -31,26 +28,14 @@ public class CachedQueriesMapper3 implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD"; private final static Cache cache = Caffeine.newBuilder().maximumSize(10_000).build(); public CachedQueriesMapper3() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); AtomicInteger key = new AtomicInteger(); diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_DbStorage.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_DbStorage.java index 4ae1110059a..db382dcbcd7 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_DbStorage.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_DbStorage.java @@ -6,6 +6,7 @@ import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; +import io.vertx.sqlclient.Tuple; import java.util.SplittableRandom; @@ -28,7 +29,7 @@ public DbRouteMapper_DbStorage(DbStorage dbStorage) { @Override public void run(WebContext webContext) { //World world = dbStorage.findEntity(World.class, randomWorld()); - DataMap row = dbStorage.queryRow("SELECT id, randomnumber FROM world WHERE id = ?", randomWorld()); + DataMap row = dbStorage.queryRow("SELECT id, randomnumber FROM world WHERE id = ?", Tuple.of(randomWorld())); webContext.routingContext().response() .putHeader("Content-Type", "application/json;charset=UTF-8") diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java index 7a57382d1cf..94c8ec4a960 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/DbRouteMapper_Postgresql.java @@ -1,13 +1,11 @@ package io.tadx.benchmark.route_mapper; -import io.tadx.core.TadxApplication; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.WebResult; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; import io.vertx.sqlclient.*; import java.util.SplittableRandom; @@ -20,25 +18,13 @@ public class DbRouteMapper_Postgresql implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClient client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; //private final PreparedQuery> SELECT_WORLD_QUERY; public DbRouteMapper_Postgresql() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java index 08c5d45d762..ece8708932e 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper1.java @@ -1,18 +1,13 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.Fortune; -import io.tadx.core.TadxApplication; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.WebResult; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.template.FreemarkerEngine; -import io.tadx.web.template.TemplateEngine; -import io.tadx.web.template.TemplateType; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Tuple; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -28,24 +23,12 @@ @RouteMapping(path = "/fortunes") public class FortunesRouteMapper1 implements RouteMapper { - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_FORTUNES = "SELECT id, message FROM fortune"; public FortunesRouteMapper1() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); } @Override diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper2.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper2.java index 9227cb920ab..3694c27471e 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper2.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/FortunesRouteMapper2.java @@ -1,15 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.Fortune; -import io.tadx.core.TadxApplication; import io.tadx.core.utils.Utils; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Tuple; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -24,25 +21,12 @@ */ @RouteMapping(path = "/fortunes2") public class FortunesRouteMapper2 implements RouteMapper { - - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_FORTUNES = "SELECT id, message FROM fortune"; public FortunesRouteMapper2() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client();; } @Override diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java index 6561755cbf7..9452e138a76 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper1_Postgresql.java @@ -1,14 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -21,29 +19,17 @@ /** * RouteMapper+Postgresql Client 模式的/queries测试(多查询时性能低于批量执行) */ -@RouteMapping(path = "/queries") +@RouteMapping(path = "/queries1") public class QueriesRouteMapper1_Postgresql implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; //private final PreparedQuery> SELECT_WORLD_QUERY; public QueriesRouteMapper1_Postgresql() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper2_Postgresql.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper2_Postgresql.java index 7ec2447d116..8e78dc92fc5 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper2_Postgresql.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/QueriesRouteMapper2_Postgresql.java @@ -1,15 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.Tuple; @@ -23,29 +20,18 @@ /** * RouteMapper+Postgresql Client 模式的/queries测试 */ -@RouteMapping(path = "/queries2") +@RouteMapping(path = "/queries") public class QueriesRouteMapper2_Postgresql implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; //private final PreparedQuery> SELECT_WORLD_QUERY; public QueriesRouteMapper2_Postgresql() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); + // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client();; //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); } diff --git a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java index d8c43978123..334f61d7c98 100644 --- a/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java +++ b/frameworks/Java/tadx/src/main/java/io/tadx/benchmark/route_mapper/UpdateMapper.java @@ -1,14 +1,12 @@ package io.tadx.benchmark.route_mapper; +import io.tadx.benchmark.db.PgConnPool; import io.tadx.benchmark.entity.World; -import io.tadx.core.TadxApplication; import io.tadx.core.data.Json; import io.tadx.web.TadxWebApplication; import io.tadx.web.WebContext; import io.tadx.web.annotation.RouteMapping; import io.tadx.web.route.RouteMapper; -import io.vertx.pgclient.PgBuilder; -import io.vertx.pgclient.PgConnectOptions; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; @@ -25,25 +23,12 @@ public class UpdateMapper implements RouteMapper { private static final SplittableRandom RANDOM = new SplittableRandom(); - PgConnectOptions connectOptions; - PoolOptions poolOptions; SqlClientInternal client; private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; //private final PreparedQuery> SELECT_WORLD_QUERY; public UpdateMapper() { - connectOptions = new PgConnectOptions(). - setPort(5432).setHost("tfb-database"). - setDatabase("hello_world"). - setUser("benchmarkdbuser"). - setPassword("benchmarkdbpass"). - setCachePreparedStatements(true). - setPreparedStatementCacheMaxSize(1024). - setPipeliningLimit(100000); - // Pool options - poolOptions = new PoolOptions().setMaxSize(2000); - // Create the client pool - client = (SqlClientInternal) PgBuilder.client().with(poolOptions).connectingTo(connectOptions).using(TadxApplication.vertx()).build(); + client = PgConnPool.client(); //SELECT_WORLD_QUERY = client.preparedQuery(SELECT_WORLD); } diff --git a/frameworks/Java/tadx/src/main/resources/application.yaml b/frameworks/Java/tadx/src/main/resources/application.yaml index 0808d6f2b45..af6ab59a47e 100644 --- a/frameworks/Java/tadx/src/main/resources/application.yaml +++ b/frameworks/Java/tadx/src/main/resources/application.yaml @@ -9,15 +9,16 @@ tadx: web: server: - port: 8000 + port: 8080 static-resource-list: - prefix: /static folder: /home/tadpole/dev/tadx.io/tadx-docs/docs/_static data: db-storage: - driver-type: jdbc # reactive - db-type: postgresql - url: jdbc:postgresql://tfb-database:5432/hello_world + type: postgresql + host: tfb-database + port: 5432 + database: hello_world username: benchmarkdbuser password: benchmarkdbpass diff --git a/frameworks/Java/tadx/tadx.dockerfile b/frameworks/Java/tadx/tadx.dockerfile index 4a2ae380fac..3ed655e444a 100644 --- a/frameworks/Java/tadx/tadx.dockerfile +++ b/frameworks/Java/tadx/tadx.dockerfile @@ -6,28 +6,36 @@ #FROM gradle:8.14.3-jdk21 # maven:3.9.9-eclipse-temurin-24-noble -FROM eclipse-temurin:21-jdk +FROM maven:3.9.9-eclipse-temurin-24-noble WORKDIR /tadx #COPY --from=build /home/gradle/tadx-benchmark/build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar tadx.jar COPY ./build/libs/tadx-benchmark-0.0.1-SNAPSHOT.jar tadx.jar -EXPOSE 8000 +EXPOSE 8080 CMD java $JAVA_OPTIONS \ - -server -Xms2G -Xmx2G \ + --enable-native-access=ALL-UNNAMED \ + --sun-misc-unsafe-memory-access=allow \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + -server -Xms2G \ -XX:+UseParallelGC \ -XX:+UseNUMA \ - -Dvertx.disableMetrics=true \ - -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ - -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ - -Dvertx.cacheImmutableHttpResponseHeaders=true \ - -Dvertx.disableHttpHeadersValidation=true \ - -Dio.netty.buffer.checkBounds=false \ - -Dio.netty.buffer.checkAccessible=false \ - -Djava.lang.Integer.IntegerCache.high=10000 \ - -Dfile.encoding=UTF-8 \ - -Djdk.trackAllThreads=false \ + -XX:+UnlockDiagnosticVMOptions \ + -XX:+DebugNonSafepoints \ + -Dvertx.disableMetrics=true \ + -Dvertx.disableWebsockets=true \ + -Dvertx.flashPolicyHandler=false \ + -Dvertx.threadChecks=false \ + -Dvertx.disableContextTimings=true \ + -Dvertx.disableTCCL=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ + -Dio.netty.noUnsafe=false \ + -Dio.netty.buffer.checkBounds=false \ + -Dio.netty.buffer.checkAccessible=false \ + -Dio.netty.iouring.ringSize=16384 \ + -Djdk.trackAllThreads=false \ + -Djava.lang.Integer.IntegerCache.high=10000 \ + -Dfile.encoding=UTF-8 \ -jar tadx.jar