diff --git a/frameworks/Java/today/.gitignore b/frameworks/Java/today/.gitignore
new file mode 100644
index 00000000000..ea1cbb085ef
--- /dev/null
+++ b/frameworks/Java/today/.gitignore
@@ -0,0 +1,9 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
+
+.idea
+today.properties
+gradle
\ No newline at end of file
diff --git a/frameworks/Java/today/README.md b/frameworks/Java/today/README.md
new file mode 100644
index 00000000000..a7c42243f25
--- /dev/null
+++ b/frameworks/Java/today/README.md
@@ -0,0 +1,26 @@
+# [TODAY Infrastructure](https://github.com/TAKETODAY/today-infrastructure) Benchmarking Test
+
+## Test URLs
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext
+
+### DB
+
+http://localhost:8080/db
+
+### QUERY
+
+http://localhost:8080/queries?queries=
+
+### UPDATE
+
+http://localhost:8080/update?queries=
+
+### FORTUNES
+
+http://localhost:8080/fortunes
diff --git a/frameworks/Java/today/benchmark_config.json b/frameworks/Java/today/benchmark_config.json
new file mode 100755
index 00000000000..92c3c756ad1
--- /dev/null
+++ b/frameworks/Java/today/benchmark_config.json
@@ -0,0 +1,30 @@
+{
+ "framework": "today",
+ "tests": [
+ {
+ "default": {
+ "json_url": "/json",
+ "plaintext_url": "/plaintext",
+ "db_url": "/db",
+ "query_url": "/queries?queries=",
+ "fortune_url": "/fortunes",
+ "update_url": "/updates?queries=",
+ "port": 8080,
+ "approach": "Realistic",
+ "classification": "Fullstack",
+ "database": "mysql",
+ "framework": "Today",
+ "language": "Java",
+ "flavor": "None",
+ "orm": "micro",
+ "platform": "Netty",
+ "webserver": "None",
+ "os": "Linux",
+ "database_os": "Linux",
+ "display_name": "Today",
+ "notes": "",
+ "versus": "None"
+ }
+ }
+ ]
+}
diff --git a/frameworks/Java/today/build.gradle b/frameworks/Java/today/build.gradle
new file mode 100644
index 00000000000..a95a1982f4e
--- /dev/null
+++ b/frameworks/Java/today/build.gradle
@@ -0,0 +1,63 @@
+description = "benchmark"
+
+apply plugin: "java"
+apply plugin: "application"
+apply plugin: 'cn.taketoday.application'
+apply plugin: 'io.spring.dependency-management'
+
+configure(allprojects) {
+ group = "cn.taketoday.benchmark"
+
+ repositories {
+ mavenCentral()
+ maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+ }
+}
+
+dependencies {
+ implementation 'cn.taketoday:today-starter-netty'
+ implementation 'cn.taketoday:today-starter-json'
+ implementation 'cn.taketoday:today-starter-jdbc'
+ implementation 'cn.taketoday:today-starter-web'
+ implementation 'cn.taketoday:today-starter-freemarker'
+
+ implementation 'mysql:mysql-connector-java'
+
+ implementation 'ch.qos.logback:logback-classic'
+
+ implementation('io.netty:netty-transport-native-epoll') {
+ artifact {
+ classifier = 'linux-x86_64'
+ }
+ }
+
+// implementation('io.netty:netty-transport-native-kqueue') {
+// artifact {
+// classifier = 'osx-aarch_64'
+// }
+// }
+
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+}
+
+application {
+ mainClass = 'cn.taketoday.benchmark.BenchmarkApplication'
+ applicationDefaultJvmArgs = [
+ "-server",
+ "-XX:+UseNUMA",
+ "-XX:+UseG1GC",
+ "-XX:+DisableExplicitGC",
+ "-XX:-StackTraceInThrowable",
+ "-XX:+UseStringDeduplication",
+ "-Dinfra.profiles.active=test",
+ "-Dio.netty.buffer.checkBounds=false",
+ "-Dio.netty.buffer.checkAccessible=false",
+ "-Dio.netty.leakDetection.level=disabled",
+ "--add-opens=java.base/java.nio=ALL-UNNAMED",
+ "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"
+ ]
+}
diff --git a/frameworks/Java/today/config.toml b/frameworks/Java/today/config.toml
new file mode 100644
index 00000000000..dc2e84c877d
--- /dev/null
+++ b/frameworks/Java/today/config.toml
@@ -0,0 +1,20 @@
+[framework]
+name = "today"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Fullstack"
+database = "mysql"
+database_os = "Linux"
+display_name = "today"
+os = "Linux"
+orm = "raw"
+platform = "Netty"
+webserver = "None"
+versus = "None"
diff --git a/frameworks/Java/today/gradle.properties b/frameworks/Java/today/gradle.properties
new file mode 100644
index 00000000000..9379f1c95c9
--- /dev/null
+++ b/frameworks/Java/today/gradle.properties
@@ -0,0 +1,7 @@
+version=1.0.0
+#infraVersion=4.0.0-Draft.6-SNAPSHOT
+infraVersion=4.0.0-Draft.6
+
+org.gradle.caching=true
+org.gradle.jvmargs=-Xmx2048m
+org.gradle.parallel=true
diff --git a/frameworks/Java/today/settings.gradle b/frameworks/Java/today/settings.gradle
new file mode 100644
index 00000000000..8cb2bee3734
--- /dev/null
+++ b/frameworks/Java/today/settings.gradle
@@ -0,0 +1,15 @@
+buildscript {
+ repositories {
+ mavenLocal()
+ maven {
+ url "https://oss.sonatype.org/content/repositories/snapshots/"
+ }
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath "cn.taketoday:infra-gradle-plugin:$infraVersion"
+ }
+}
+
+rootProject.name = 'today'
diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java
new file mode 100644
index 00000000000..1d385a77133
--- /dev/null
+++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java
@@ -0,0 +1,70 @@
+package cn.taketoday.benchmark;
+
+import java.time.ZonedDateTime;
+
+import javax.sql.DataSource;
+
+import cn.taketoday.beans.factory.annotation.DisableAllDependencyInjection;
+import cn.taketoday.beans.factory.config.BeanDefinition;
+import cn.taketoday.context.annotation.Configuration;
+import cn.taketoday.context.annotation.Role;
+import cn.taketoday.framework.web.netty.NettyRequestConfig;
+import cn.taketoday.framework.web.netty.SendErrorHandler;
+import cn.taketoday.jdbc.RepositoryManager;
+import cn.taketoday.jdbc.persistence.EntityManager;
+import cn.taketoday.stereotype.Component;
+import io.netty.handler.codec.http.DefaultHttpHeadersFactory;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpHeadersFactory;
+import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory;
+
+import static cn.taketoday.http.HttpHeaders.DATE_FORMATTER;
+
+/**
+ * @author Harry Yang
+ * @since 1.0 2024/3/19 12:59
+ */
+@DisableAllDependencyInjection
+@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+@Configuration(proxyBeanMethods = false)
+class AppConfig {
+
+ private static final DefaultHttpHeadersFactory headersFactory = DefaultHttpHeadersFactory.headersFactory();
+
+ @Component
+ static RepositoryManager repositoryManager(DataSource dataSource) {
+ return new RepositoryManager(dataSource);
+ }
+
+ @Component
+ static EntityManager entityManager(RepositoryManager repositoryManager) {
+ return repositoryManager.getEntityManager();
+ }
+
+ @Component
+ @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+ static NettyRequestConfig nettyRequestConfig(SendErrorHandler sendErrorHandler) {
+ var factory = new DefaultHttpDataFactory(false);
+ return NettyRequestConfig.forBuilder()
+ .httpDataFactory(factory)
+ .sendErrorHandler(sendErrorHandler)
+ .headersFactory(new HttpHeadersFactory() {
+
+ @Override
+ public HttpHeaders newHeaders() {
+ HttpHeaders headers = headersFactory.newHeaders();
+ headers.set("Server", "TODAY");
+ headers.set("Date", DATE_FORMATTER.format(ZonedDateTime.now()));
+ return headers;
+ }
+
+ @Override
+ public HttpHeaders newEmptyHeaders() {
+ return headersFactory.newEmptyHeaders();
+ }
+ })
+ .secure(false)
+ .build();
+ }
+
+}
diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java
new file mode 100644
index 00000000000..0e2eea0f995
--- /dev/null
+++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java
@@ -0,0 +1,13 @@
+package cn.taketoday.benchmark;
+
+import cn.taketoday.framework.Application;
+import cn.taketoday.framework.InfraApplication;
+
+@InfraApplication
+public class BenchmarkApplication {
+
+ public static void main(String[] args) {
+ Application.run(BenchmarkApplication.class, args);
+ }
+
+}
diff --git a/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java
new file mode 100644
index 00000000000..d0d240534bd
--- /dev/null
+++ b/frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java
@@ -0,0 +1,120 @@
+package cn.taketoday.benchmark.http;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.IntStream;
+
+import cn.taketoday.benchmark.model.Fortune;
+import cn.taketoday.benchmark.model.World;
+import cn.taketoday.http.MediaType;
+import cn.taketoday.http.ResponseEntity;
+import cn.taketoday.jdbc.persistence.EntityManager;
+import cn.taketoday.lang.Nullable;
+import cn.taketoday.ui.Model;
+import cn.taketoday.web.annotation.GET;
+import cn.taketoday.web.annotation.RestController;
+import cn.taketoday.web.view.ViewRef;
+
+/**
+ * @author Harry Yang
+ * @since 1.0 2024/3/19 12:56
+ */
+@RestController
+final class BenchmarkHttpHandler {
+
+ private static final int MIN_WORLD_NUMBER = 1;
+ private static final int MAX_WORLD_NUMBER = 10_000;
+
+ private final EntityManager entityManager;
+
+ BenchmarkHttpHandler(EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ @GET("/json")
+ public ResponseEntity