Browse Source

Merge pull request #20 from TechEmpower/master

aa
三刀 3 years ago
parent
commit
13fb0979fc
100 changed files with 2647 additions and 447 deletions
  1. 5 5
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/Data/Providers/RawDbMySqlConnector.cs
  2. 7 7
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/Data/Providers/RawDbNpgsql.cs
  3. 3 3
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/PlatformBenchmarks.csproj
  4. 1 1
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/appsettings.postgresql.json
  5. 1 1
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/appsettings.postgresql.updates.json
  6. 0 51
      frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/npgsql.rd.xml
  7. 1 1
      frameworks/CSharp/aspnetcore/Benchmarks/appsettings.postgresql.json
  8. 1 1
      frameworks/CSharp/aspnetcore/Benchmarks/appsettings.postgresql.updates.json
  9. 1 1
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/appsettings.postgresql.json
  10. 1 1
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/appsettings.postgresql.updates.json
  11. 4 4
      frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj
  12. 1 1
      frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs
  13. 6 6
      frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html
  14. 8 8
      frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html
  15. 1 1
      frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs
  16. 1 1
      frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs
  17. 2 10
      frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs
  18. 1 1
      frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs
  19. 51 0
      frameworks/Dart/angel3/README.md
  20. 21 0
      frameworks/Dart/angel3/angel3.dockerfile
  21. 28 0
      frameworks/Dart/angel3/benchmark_config.json
  22. 1 0
      frameworks/Dart/angel3/orm/analysis_options.yaml
  23. 10 0
      frameworks/Dart/angel3/orm/config/default.yaml
  24. 3 0
      frameworks/Dart/angel3/orm/config/production.yaml
  25. 19 0
      frameworks/Dart/angel3/orm/lib/benchmark_app.dart
  26. 2 0
      frameworks/Dart/angel3/orm/lib/models.dart
  27. 31 0
      frameworks/Dart/angel3/orm/lib/src/config/config.dart
  28. 35 0
      frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart
  29. 10 0
      frameworks/Dart/angel3/orm/lib/src/config/plugins/plugins.dart
  30. 16 0
      frameworks/Dart/angel3/orm/lib/src/models/fortune.dart
  31. 200 0
      frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart
  32. 16 0
      frameworks/Dart/angel3/orm/lib/src/models/world.dart
  33. 203 0
      frameworks/Dart/angel3/orm/lib/src/models/world.g.dart
  34. 120 0
      frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart
  35. 60 0
      frameworks/Dart/angel3/orm/lib/src/routes/routes.dart
  36. 13 0
      frameworks/Dart/angel3/orm/lib/src/services/services.dart
  37. 838 0
      frameworks/Dart/angel3/orm/pubspec.lock
  38. 31 0
      frameworks/Dart/angel3/orm/pubspec.yaml
  39. 29 0
      frameworks/Dart/angel3/orm/run/prod.dart
  40. 5 0
      frameworks/Dart/angel3/orm/views/error.jael
  41. 5 0
      frameworks/Dart/angel3/orm/views/hello.jael
  42. 17 0
      frameworks/Dart/angel3/orm/views/layout.jael
  43. 14 0
      frameworks/Dart/angel3/orm/views/listing.jael
  44. 27 0
      frameworks/Dart/angel3/orm/web/css/site.css
  45. BIN
      frameworks/Dart/angel3/orm/web/images/favicon.png
  46. 2 0
      frameworks/Dart/angel3/orm/web/robots.txt
  47. 1 1
      frameworks/Go/atreugo/atreugo-prefork.dockerfile
  48. 1 1
      frameworks/Go/atreugo/atreugo.dockerfile
  49. 25 4
      frameworks/Go/atreugo/src/go.mod
  50. 27 32
      frameworks/Go/atreugo/src/go.sum
  51. 1 1
      frameworks/Go/fasthttp/fasthttp-prefork.dockerfile
  52. 1 1
      frameworks/Go/fasthttp/fasthttp.dockerfile
  53. 23 5
      frameworks/Go/fasthttp/src/go.mod
  54. 32 31
      frameworks/Go/fasthttp/src/go.sum
  55. 1 6
      frameworks/Java/isocket-nio/pom.xml
  56. 4 0
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/Consts.java
  57. 5 5
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/HttpBootstrap.java
  58. 19 4
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/http/HttpRequestEntity.java
  59. 15 4
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/http/HttpResponseEntity.java
  60. 6 3
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/processor/PlanTextProcessor.java
  61. 17 8
      frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/protocol/SimpleHttpProtocol.java
  62. 1 1
      frameworks/Java/netty/pom.xml
  63. 3 3
      frameworks/Java/redkale/benchmark_config.json
  64. 20 0
      frameworks/Java/redkale/conf/persistence-mysql.xml
  65. 3 3
      frameworks/Java/redkale/config.toml
  66. 6 5
      frameworks/Java/redkale/pom-mongodb.xml
  67. 4 3
      frameworks/Java/redkale/pom.xml
  68. 2 15
      frameworks/Java/redkale/redkale-cache.dockerfile
  69. 3 2
      frameworks/Java/redkale/redkale-graalvm.dockerfile
  70. 3 16
      frameworks/Java/redkale/redkale-mongodb.dockerfile
  71. 12 0
      frameworks/Java/redkale/redkale-mysql.dockerfile
  72. 2 2
      frameworks/Java/redkale/redkale-native.dockerfile
  73. 2 15
      frameworks/Java/redkale/redkale-postgres.dockerfile
  74. 2 15
      frameworks/Java/redkale/redkale.dockerfile
  75. 0 5
      frameworks/Java/redkale/setup.bat
  76. 17 40
      frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java
  77. 23 19
      frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java
  78. 22 6
      frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java
  79. 4 1
      frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/World.java
  80. 0 23
      frameworks/Kotlin/hexagon/benchmark_config.json
  81. 5 5
      frameworks/Kotlin/hexagon/build.gradle
  82. 0 18
      frameworks/Kotlin/hexagon/config.toml
  83. 0 26
      frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile
  84. 2 1
      frameworks/Kotlin/hexagon/hexagon.dockerfile
  85. 2 1
      frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt
  86. 3 3
      frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt
  87. 2 2
      frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt
  88. 3 3
      frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt
  89. 2 2
      frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt
  90. 1 1
      frameworks/Nim/httpbeast/techempower.nimble
  91. 1 1
      frameworks/Nim/jester/techempower.nimble
  92. 102 0
      frameworks/PHP/openswoole/README.md
  93. 70 0
      frameworks/PHP/openswoole/benchmark_config.json
  94. 49 0
      frameworks/PHP/openswoole/config.toml
  95. 116 0
      frameworks/PHP/openswoole/db-no-async.php
  96. 15 0
      frameworks/PHP/openswoole/openswoole-no-async.dockerfile
  97. 22 0
      frameworks/PHP/openswoole/openswoole-postgres.dockerfile
  98. 18 0
      frameworks/PHP/openswoole/openswoole.dockerfile
  99. 6 0
      frameworks/PHP/openswoole/php.ini
  100. 69 0
      frameworks/PHP/openswoole/swoole-server-noasync.php

+ 5 - 5
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/Data/Providers/RawDbMySqlConnector.cs

@@ -19,8 +19,8 @@ namespace PlatformBenchmarks
     {
         private readonly ConcurrentRandom _random;
         private readonly string _connectionString;
-        private readonly MemoryCache _cache = new MemoryCache(
-            new MemoryCacheOptions()
+        private readonly MemoryCache _cache = new(
+            new MemoryCacheOptions
             {
                 ExpirationScanFrequency = TimeSpan.FromMinutes(60)
             });
@@ -98,7 +98,7 @@ namespace PlatformBenchmarks
                     var (cmd, idParameter) = await rawdb.CreateReadCommandAsync(db);
                     using (cmd)
                     {
-                        Func<ICacheEntry, Task<CachedWorld>> create = async (entry) =>
+                        Func<ICacheEntry, Task<CachedWorld>> create = async _ =>
                         {
                             return await rawdb.ReadSingleRow(cmd);
                         };
@@ -110,7 +110,7 @@ namespace PlatformBenchmarks
 
                         for (; i < result.Length; i++)
                         {
-                            result[i] = await rawdb._cache.GetOrCreateAsync<CachedWorld>(key, create);
+                            result[i] = await rawdb._cache.GetOrCreateAsync(key, create);
 
                             id = rawdb._random.Next(1, 10001);
                             idParameter.Value = id;
@@ -245,7 +245,7 @@ namespace PlatformBenchmarks
             }
         }
         
-        private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray();
+        private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select(i => new CacheKey(i)).ToArray();
 
         public sealed class CacheKey : IEquatable<CacheKey>
         {

+ 7 - 7
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/Data/Providers/RawDbNpgsql.cs

@@ -19,8 +19,8 @@ namespace PlatformBenchmarks
     {
         private readonly ConcurrentRandom _random;
         private readonly string _connectionString;
-        private readonly MemoryCache _cache = new MemoryCache(
-            new MemoryCacheOptions()
+        private readonly MemoryCache _cache = new(
+            new MemoryCacheOptions
             {
                 ExpirationScanFrequency = TimeSpan.FromMinutes(60)
             });
@@ -98,7 +98,7 @@ namespace PlatformBenchmarks
                     var (cmd, idParameter) = rawdb.CreateReadCommand(db);
                     using (cmd)
                     {
-                        Func<ICacheEntry, Task<CachedWorld>> create = async (entry) =>
+                        Func<ICacheEntry, Task<CachedWorld>> create = async _ =>
                         {
                             return await rawdb.ReadSingleRow(cmd);
                         };
@@ -110,7 +110,7 @@ namespace PlatformBenchmarks
 
                         for (; i < result.Length; i++)
                         {
-                            result[i] = await rawdb._cache.GetOrCreateAsync<CachedWorld>(key, create);
+                            result[i] = await rawdb._cache.GetOrCreateAsync(key, create);
 
                             id = rawdb._random.Next(1, 10001);
                             idParameter.TypedValue = id;
@@ -215,8 +215,8 @@ namespace PlatformBenchmarks
 
         private (NpgsqlCommand readCmd, NpgsqlParameter<int> idParameter) CreateReadCommand(NpgsqlConnection connection)
         {
-            var cmd = new NpgsqlCommand("SELECT id, randomnumber FROM world WHERE id = @Id", connection);
-            var parameter = new NpgsqlParameter<int>(parameterName: "@Id", value: _random.Next(1, 10001));
+            var cmd = new NpgsqlCommand("SELECT id, randomnumber FROM world WHERE id = $1", connection);
+            var parameter = new NpgsqlParameter<int> { TypedValue = _random.Next(1, 10001) };
 
             cmd.Parameters.Add(parameter);
 
@@ -238,7 +238,7 @@ namespace PlatformBenchmarks
             }
         }
 
-        private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray();
+        private static readonly object[] _cacheKeys = Enumerable.Range(0, 10001).Select(i => new CacheKey(i)).ToArray();
 
         public sealed class CacheKey : IEquatable<CacheKey>
         {

+ 3 - 3
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/PlatformBenchmarks.csproj

@@ -24,8 +24,8 @@
   </PropertyGroup>
   
   <ItemGroup>
-    <PackageReference Condition=" '$(DatabaseProvider)' == 'Npgsql' " Include="Npgsql" Version="6.0.0-preview4" />
-    <PackageReference Condition=" '$(DatabaseProvider)' == 'MySqlConnector' " Include="MySqlConnector" Version="1.3.12" />
+    <PackageReference Condition=" '$(DatabaseProvider)' == 'Npgsql' " Include="Npgsql" Version="6.0.0-rc.2" />
+    <PackageReference Condition=" '$(DatabaseProvider)' == 'MySqlConnector' " Include="MySqlConnector" Version="1.3.13" />
     <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" />
   </ItemGroup>
 
@@ -34,7 +34,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <RdXmlFile Condition=" '$(DatabaseProvider)' == 'Npgsql' " Include="npgsql.rd.xml" />
+    <IlcArg Include="--instructionset:sse4.2" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/appsettings.postgresql.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
   "Database": "postgresql"
 }

+ 1 - 1
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/appsettings.postgresql.updates.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",  
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",  
   "Database": "postgresql"
 }

+ 0 - 51
frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks/npgsql.rd.xml

@@ -1,51 +0,0 @@
-<Directives>
-  <Application>
-    <Assembly Name="Npgsql">
-      <Type Name="Npgsql.Internal.TypeHandlers.NetworkHandlers.InetHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.DateTimeHandlers.DateHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.DateTimeHandlers.IntervalHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.DateTimeHandlers.TimestampTzHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.BoolHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.EnumHandler`1" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.UuidHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.VoidHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.DoubleHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.Int16Handler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.Int32Handler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.Int64Handler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.MoneyHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.SingleHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.UInt32Handler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NetworkHandlers.CidrHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NetworkHandlers.MacaddrHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.InternalTypeHandlers.InternalCharHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.InternalTypeHandlers.PgLsnHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.InternalTypeHandlers.TidHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.BoxHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.CircleHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.LineHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.LineSegmentHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.PointHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.DateTimeHandlers.TimeHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.DateTimeHandlers.TimeTzHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.BitStringHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.ByteaHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.HstoreHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.JsonHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.JsonPathHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.RangeHandler`2" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.RecordHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.UnknownTypeHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.UnmappedEnumHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.LTreeHandlers.LQueryHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.LTreeHandlers.LTreeHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.LTreeHandlers.LTxtQueryHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.NumericHandlers.NumericHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.PathHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.GeometricHandlers.PolygonHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.FullTextSearchHandlers.TsQueryHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.FullTextSearchHandlers.TsVectorHandler" Dynamic="Required All" />
-      <Type Name="Npgsql.Internal.TypeHandlers.CompositeHandlers.CompositeHandler`1" Dynamic="Required All" />
-    </Assembly>
-  </Application>
-</Directives>

+ 1 - 1
frameworks/CSharp/aspnetcore/Benchmarks/appsettings.postgresql.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
   "Database": "postgresql"
 }

+ 1 - 1
frameworks/CSharp/aspnetcore/Benchmarks/appsettings.postgresql.updates.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
   "Database": "postgresql"
 }

+ 1 - 1
frameworks/CSharp/aspnetcore/PlatformBenchmarks/appsettings.postgresql.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",
   "Database": "postgresql"
 }

+ 1 - 1
frameworks/CSharp/aspnetcore/PlatformBenchmarks/appsettings.postgresql.updates.json

@@ -1,4 +1,4 @@
 {
-  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",  
+  "ConnectionString": "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000",  
   "Database": "postgresql"
 }

+ 4 - 4
frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj

@@ -26,10 +26,10 @@
   </ItemGroup>
     
   <ItemGroup>
-    <PackageReference Include="GenHTTP.Core" Version="6.2.0" />
-    <PackageReference Include="GenHTTP.Modules.Razor" Version="6.2.0" />
-    <PackageReference Include="GenHTTP.Modules.Webservices" Version="6.2.0" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
+    <PackageReference Include="GenHTTP.Core" Version="6.3.0" />
+    <PackageReference Include="GenHTTP.Modules.Razor" Version="6.3.0" />
+    <PackageReference Include="GenHTTP.Modules.Webservices" Version="6.3.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.1" />
   </ItemGroup>
   

+ 1 - 1
frameworks/CSharp/genhttp/Benchmarks/Model/DatabaseContext.cs

@@ -25,7 +25,7 @@ namespace Benchmarks.Model
         {
             var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
 
-            optionsBuilder.UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4");
+            optionsBuilder.UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4");
 
             if (!tracking)
             {

+ 6 - 6
frameworks/CSharp/genhttp/Benchmarks/Resources/Fortunes.html

@@ -1,7 +1,7 @@
-<table>
-    <tr><th>id</th><th>message</th></tr>
-    @foreach (var cookie in Model.Cookies)
-    {
-    <tr><td>@cookie.ID</td><td>@HttpUtility.HtmlEncode(cookie.Message)</td></tr>
-    }
+<table>
+    <tr><th>id</th><th>message</th></tr>
+    @foreach (var cookie in Model.Cookies)
+    {
+    <tr><td>@cookie.ID</td><td>@HttpUtility.HtmlEncode(cookie.Message)</td></tr>
+    }
 </table>

+ 8 - 8
frameworks/CSharp/genhttp/Benchmarks/Resources/Template.html

@@ -1,9 +1,9 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>@Model.Meta.Title</title>
-</head>
-<body>
-    @Model.Content
-</body>
+<!DOCTYPE html>
+<html>
+<head>
+    <title>@Model.Meta.Title</title>
+</head>
+<body>
+    @Model.Content
+</body>
 </html>

+ 1 - 1
frameworks/CSharp/genhttp/Benchmarks/Tests/CacheResource.cs

@@ -17,7 +17,7 @@ namespace Benchmarks.Tests
     {
         private static readonly Random _Random = new Random();
 
-        private readonly MemoryCache _Cache = new MemoryCache(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromMinutes(60) });
+        private static readonly MemoryCache _Cache = new MemoryCache(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromMinutes(60) });
 
         private static readonly object[] _CacheKeys = Enumerable.Range(0, 10001).Select((i) => new CacheKey(i)).ToArray();
 

+ 1 - 1
frameworks/CSharp/genhttp/Benchmarks/Tests/DbResource.cs

@@ -12,7 +12,7 @@ namespace Benchmarks.Tests
 
     public sealed class DbResource
     {
-        private static Random _Random = new Random();
+        private static readonly Random _Random = new();
 
         [ResourceMethod]
         public async ValueTask<World> GetRandomWorld()

+ 2 - 10
frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs

@@ -2,6 +2,7 @@
 using System.Threading.Tasks;
 using System.Linq;
 using System.Web;
+using System.IO;
 
 using Microsoft.EntityFrameworkCore;
 
@@ -13,7 +14,6 @@ using GenHTTP.Modules.IO;
 using GenHTTP.Modules.Razor;
 
 using Benchmarks.Model;
-using System.IO;
 
 namespace Benchmarks.Tests
 {
@@ -50,7 +50,6 @@ namespace Benchmarks.Tests
 
     public class FortuneHandler : IHandler, IPageRenderer
     {
-        private static readonly FlexibleContentType CONTENT_TYPE = new FlexibleContentType("text/html; charset=utf-8");
 
         #region Get-/Setters
 
@@ -95,14 +94,7 @@ namespace Benchmarks.Tests
 
         public ValueTask RenderAsync(TemplateModel model, Stream target) => Template.RenderAsync(model, target);
 
-        public async ValueTask<IResponse> HandleAsync(IRequest request)
-        {
-            var response = await Page.HandleAsync(request);
-
-            response.ContentType = CONTENT_TYPE;
-
-            return response;
-        }
+        public ValueTask<IResponse> HandleAsync(IRequest request) => Page.HandleAsync(request);
 
         private static async ValueTask<FortuneModel> GetFortunes(IRequest request, IHandler handler)
         {

+ 1 - 1
frameworks/CSharp/genhttp/Benchmarks/Tests/JsonResource.cs

@@ -14,7 +14,7 @@ namespace Benchmarks.Tests
     {
 
         [ResourceMethod]
-        public JsonResult GetMessage() => new JsonResult() { Message = "Hello, World!" };
+        public JsonResult GetMessage() => new() { Message = "Hello, World!" };
 
     }
 

+ 51 - 0
frameworks/Dart/angel3/README.md

@@ -0,0 +1,51 @@
+# Angel3 Framework Benchmarking Test
+
+This is the Angel3 framework portion of a [benchmarking test suite](../) comparing a variety of web development platforms. 
+
+## Description
+
+All the tests are implemented using the [Angel3 Framework](https://angel3-framework.web.app) with ORM for Postgresql database enabled. The directory layout follows the standard ORM boilerplate template.
+
+### Test Type Implementation Source Code
+
+* [JSON](orm/lib/src/routes/controllers/controllers.dart)
+* [PLAINTEXT](orm/lib/src/routes/controllers/controllers.dart)
+* [DB](orm/lib/src/routes/controllers/controllers.dart)
+* [QUERY](orm/lib/src/routes/controllers/controllers.dart)
+* [UPDATE](orm/lib/src/routes/controllers/controllers.dart)
+* [FORTUNES](orm/lib/src/routes/controllers/controllers.dart)
+* [FORTUNES VIEW TEMPLATE](orm/views/listing.jael)
+
+## Important Libraries
+
+The tests were run with:
+
+* [Dart](https://dart.dev/get-dart)
+* [Angel3 Framework](https://angel3-framework.web.app)
+* [Example](https://angel3-framework.web.app/#/examples)
+
+## Test URLs
+
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext
+
+### DB
+
+http://localhost:8080/db
+
+### QUERY
+
+http://localhost:8080/query?queries=
+
+### UPDATE
+
+http://localhost:8080/update?queries=
+
+### FORTUNES
+
+http://localhost:8080/fortunes

+ 21 - 0
frameworks/Dart/angel3/angel3.dockerfile

@@ -0,0 +1,21 @@
+FROM google/dart:latest
+
+COPY ./orm/config /app/config
+COPY ./orm/lib /app/lib
+COPY ./orm/run /app/run
+COPY ./orm/views /app/views
+COPY ./orm/web /app/web
+COPY ./orm/*.yaml /app/
+
+WORKDIR /app
+RUN dart pub get
+
+#RUN chmod -R 777 /app/run
+
+# Optionally build generaed sources.
+# RUN pub run build_runner build
+
+# Set environment, start server
+ENV ANGEL_ENV=production
+EXPOSE 8080
+CMD dart ./run/prod.dart -p 8080 -a 0.0.0.0

+ 28 - 0
frameworks/Dart/angel3/benchmark_config.json

@@ -0,0 +1,28 @@
+{
+  "framework": "angel3",
+  "tests": [{
+     "default": {
+       "json_url": "/json",
+       "plaintext_url": "/plaintext",
+       "db_url": "/db",
+       "query_url": "/query?queries=",
+       "fortune_url": "/fortunes",
+       "update_url": "/updates?queries=",
+       "port": 8080,
+       "approach": "Realistic",
+       "classification": "Fullstack",
+       "database": "Postgres",
+       "framework": "angel3",
+       "language": "Dart",
+       "flavor": "None",
+       "orm": "Micro",
+       "platform": "angel3",
+       "webserver": "None",
+       "os": "Linux",
+       "database_os": "Linux",
+       "display_name": "Angel3",
+       "notes": "",
+       "versus": "None"
+     }
+  }]
+}

+ 1 - 0
frameworks/Dart/angel3/orm/analysis_options.yaml

@@ -0,0 +1 @@
+include: package:lints/recommended.yaml

+ 10 - 0
frameworks/Dart/angel3/orm/config/default.yaml

@@ -0,0 +1,10 @@
+# Default server configuration.
+jwt_secret: INSECURE_DEFAULT_SECRET
+host: 127.0.0.1
+port: 8080
+postgres:
+  host: tfb-database
+  port: 5432
+  database_name: hello_world
+  username: benchmarkdbuser
+  password: benchmarkdbpass

+ 3 - 0
frameworks/Dart/angel3/orm/config/production.yaml

@@ -0,0 +1,3 @@
+# Production-only server configuration
+debug: false
+jwt_secret: INSECURE_DEFAULT_SECRET

+ 19 - 0
frameworks/Dart/angel3/orm/lib/benchmark_app.dart

@@ -0,0 +1,19 @@
+/// Your very own web application!
+import 'dart:async';
+import 'package:angel3_framework/angel3_framework.dart';
+import 'package:file/local.dart';
+import 'src/config/config.dart' as configuration;
+import 'src/routes/routes.dart' as routes;
+import 'src/services/services.dart' as services;
+
+/// Configures the server instance.
+Future configureServer(Angel app) async {
+  // Grab a handle to the file system, so that we can do things like
+  // serve static files.
+  var fs = const LocalFileSystem();
+
+  // Set up our application, using the plug-ins defined with this project.
+  await app.configure(configuration.configureServer(fs));
+  await app.configure(services.configureServer);
+  await app.configure(routes.configureServer(fs));
+}

+ 2 - 0
frameworks/Dart/angel3/orm/lib/models.dart

@@ -0,0 +1,2 @@
+export 'src/models/fortune.dart';
+export 'src/models/world.dart';

+ 31 - 0
frameworks/Dart/angel3/orm/lib/src/config/config.dart

@@ -0,0 +1,31 @@
+/// Configuration for this Angel instance.
+import 'package:angel3_configuration/angel3_configuration.dart';
+import 'package:angel3_framework/angel3_framework.dart';
+import 'package:angel3_jael/angel3_jael.dart';
+import 'package:file/file.dart';
+import 'plugins/plugins.dart' as plugins;
+
+/// This is a perfect place to include configuration and load plug-ins.
+AngelConfigurer configureServer(FileSystem fileSystem) {
+  return (Angel app) async {
+    // Load configuration from the `config/` directory.
+    //
+    // See: https://github.com/angel-dart/configuration
+    await app.configure(configuration(fileSystem));
+
+    // Configure our application to render Jael templates from the `views/` directory.
+    //
+    // See: https://github.com/angel-dart/jael
+    await app.configure(jael(fileSystem.directory('views'), minified: true));
+
+    // Apply another plug-ins, i.e. ones that *you* have written.
+    //
+    // Typically, the plugins in `lib/src/config/plugins/plugins.dart` are plug-ins
+    // that add functionality specific to your application.
+    //
+    // If you write a plug-in that you plan to use again, or are
+    // using one created by the community, include it in
+    // `lib/src/config/config.dart`.
+    await plugins.configureServer(app);
+  };
+}

+ 35 - 0
frameworks/Dart/angel3/orm/lib/src/config/plugins/orm.dart

@@ -0,0 +1,35 @@
+import 'dart:async';
+import 'dart:io';
+import 'package:angel3_framework/angel3_framework.dart';
+import 'package:angel3_orm/angel3_orm.dart';
+import 'package:angel3_orm_postgres/angel3_orm_postgres.dart';
+import 'package:postgres/postgres.dart';
+
+Future<void> configureServer(Angel app) async {
+  var connection = await connectToPostgres(app.configuration);
+  await connection.open();
+
+  var logger = app.environment.isProduction ? null : app.logger;
+  var executor = PostgreSqlExecutor(connection, logger: logger);
+
+  app
+    ..container!.registerSingleton<QueryExecutor>(executor)
+    ..shutdownHooks.add((_) => connection.close());
+}
+
+Future<PostgreSQLConnection> connectToPostgres(Map configuration) async {
+  var postgresConfig = configuration['postgres'] as Map? ?? {};
+  var connection = PostgreSQLConnection(
+      postgresConfig['host'] as String? ?? 'localhost',
+      postgresConfig['port'] as int? ?? 5432,
+      postgresConfig['database_name'] as String? ??
+          Platform.environment['USER'] ??
+          Platform.environment['USERNAME'] ??
+          '',
+      username: postgresConfig['username'] as String?,
+      password: postgresConfig['password'] as String?,
+      timeZone: postgresConfig['time_zone'] as String? ?? 'UTC',
+      timeoutInSeconds: postgresConfig['timeout_in_seconds'] as int? ?? 30,
+      useSSL: postgresConfig['use_ssl'] as bool? ?? false);
+  return connection;
+}

+ 10 - 0
frameworks/Dart/angel3/orm/lib/src/config/plugins/plugins.dart

@@ -0,0 +1,10 @@
+/// Custom plugins go here.
+import 'dart:async';
+import 'package:angel3_framework/angel3_framework.dart';
+import 'orm.dart' as orm;
+
+Future configureServer(Angel app) async {
+  // Include any plugins you have made here.
+
+  await app.configure(orm.configureServer);
+}

+ 16 - 0
frameworks/Dart/angel3/orm/lib/src/models/fortune.dart

@@ -0,0 +1,16 @@
+import 'package:angel3_migration/angel3_migration.dart';
+//import 'package:angel3_model/angel3_model.dart';
+import 'package:angel3_serialize/angel3_serialize.dart';
+import 'package:angel3_orm/angel3_orm.dart';
+import 'package:optional/optional.dart';
+
+part 'fortune.g.dart';
+
+@serializable
+@Orm(tableName: 'fortune')
+abstract class _Fortune {
+  int? id;
+
+  @Column(length: 2048)
+  String? message;
+}

+ 200 - 0
frameworks/Dart/angel3/orm/lib/src/models/fortune.g.dart

@@ -0,0 +1,200 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'fortune.dart';
+
+// **************************************************************************
+// MigrationGenerator
+// **************************************************************************
+
+class FortuneMigration extends Migration {
+  @override
+  void up(Schema schema) {
+    schema.create('fortune', (table) {
+      table.integer('id');
+      table.varChar('message', length: 2048);
+    });
+  }
+
+  @override
+  void down(Schema schema) {
+    schema.drop('fortune');
+  }
+}
+
+// **************************************************************************
+// OrmGenerator
+// **************************************************************************
+
+class FortuneQuery extends Query<Fortune, FortuneQueryWhere> {
+  FortuneQuery({Query? parent, Set<String>? trampoline})
+      : super(parent: parent) {
+    trampoline ??= <String>{};
+    trampoline.add(tableName);
+    _where = FortuneQueryWhere(this);
+  }
+
+  @override
+  final FortuneQueryValues values = FortuneQueryValues();
+
+  FortuneQueryWhere? _where;
+
+  @override
+  Map<String, String> get casts {
+    return {};
+  }
+
+  @override
+  String get tableName {
+    return 'fortune';
+  }
+
+  @override
+  List<String> get fields {
+    return const ['id', 'message'];
+  }
+
+  @override
+  FortuneQueryWhere? get where {
+    return _where;
+  }
+
+  @override
+  FortuneQueryWhere newWhereClause() {
+    return FortuneQueryWhere(this);
+  }
+
+  static Fortune? parseRow(List row) {
+    if (row.every((x) => x == null)) {
+      return null;
+    }
+    var model = Fortune(id: (row[0] as int?), message: (row[1] as String?));
+    return model;
+  }
+
+  @override
+  Optional<Fortune> deserialize(List row) {
+    return Optional.ofNullable(parseRow(row));
+  }
+}
+
+class FortuneQueryWhere extends QueryWhere {
+  FortuneQueryWhere(FortuneQuery query)
+      : id = NumericSqlExpressionBuilder<int>(query, 'id'),
+        message = StringSqlExpressionBuilder(query, 'message');
+
+  final NumericSqlExpressionBuilder<int> id;
+
+  final StringSqlExpressionBuilder message;
+
+  @override
+  List<SqlExpressionBuilder> get expressionBuilders {
+    return [id, message];
+  }
+}
+
+class FortuneQueryValues extends MapQueryValues {
+  @override
+  Map<String, String> get casts {
+    return {};
+  }
+
+  int? get id {
+    return (values['id'] as int?);
+  }
+
+  set id(int? value) => values['id'] = value;
+  String? get message {
+    return (values['message'] as String?);
+  }
+
+  set message(String? value) => values['message'] = value;
+  void copyFrom(Fortune model) {
+    id = model.id;
+    message = model.message;
+  }
+}
+
+// **************************************************************************
+// JsonModelGenerator
+// **************************************************************************
+
+@generatedSerializable
+class Fortune extends _Fortune {
+  Fortune({this.id, this.message});
+
+  @override
+  int? id;
+
+  @override
+  String? message;
+
+  Fortune copyWith({int? id, String? message}) {
+    return Fortune(id: id ?? this.id, message: message ?? this.message);
+  }
+
+  @override
+  bool operator ==(other) {
+    return other is _Fortune && other.id == id && other.message == message;
+  }
+
+  @override
+  int get hashCode {
+    return hashObjects([id, message]);
+  }
+
+  @override
+  String toString() {
+    return 'Fortune(id=$id, message=$message)';
+  }
+
+  Map<String, dynamic> toJson() {
+    return FortuneSerializer.toMap(this);
+  }
+}
+
+// **************************************************************************
+// SerializerGenerator
+// **************************************************************************
+
+const FortuneSerializer fortuneSerializer = FortuneSerializer();
+
+class FortuneEncoder extends Converter<Fortune, Map> {
+  const FortuneEncoder();
+
+  @override
+  Map convert(Fortune model) => FortuneSerializer.toMap(model);
+}
+
+class FortuneDecoder extends Converter<Map, Fortune> {
+  const FortuneDecoder();
+
+  @override
+  Fortune convert(Map map) => FortuneSerializer.fromMap(map);
+}
+
+class FortuneSerializer extends Codec<Fortune, Map> {
+  const FortuneSerializer();
+
+  @override
+  FortuneEncoder get encoder => const FortuneEncoder();
+  @override
+  FortuneDecoder get decoder => const FortuneDecoder();
+  static Fortune fromMap(Map map) {
+    return Fortune(id: map['id'] as int?, message: map['message'] as String?);
+  }
+
+  static Map<String, dynamic> toMap(_Fortune? model) {
+    if (model == null) {
+      return {};
+    }
+    return {'id': model.id, 'message': model.message};
+  }
+}
+
+abstract class FortuneFields {
+  static const List<String> allFields = <String>[id, message];
+
+  static const String id = 'id';
+
+  static const String message = 'message';
+}

+ 16 - 0
frameworks/Dart/angel3/orm/lib/src/models/world.dart

@@ -0,0 +1,16 @@
+import 'package:angel3_migration/angel3_migration.dart';
+//import 'package:angel3_model/angel3_model.dart';
+import 'package:angel3_serialize/angel3_serialize.dart';
+import 'package:angel3_orm/angel3_orm.dart';
+import 'package:optional/optional.dart';
+
+part 'world.g.dart';
+
+@serializable
+@Orm(tableName: 'world')
+abstract class _World {
+  int? id;
+
+  @Column()
+  int? randomNumber;
+}

+ 203 - 0
frameworks/Dart/angel3/orm/lib/src/models/world.g.dart

@@ -0,0 +1,203 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'world.dart';
+
+// **************************************************************************
+// MigrationGenerator
+// **************************************************************************
+
+class WorldMigration extends Migration {
+  @override
+  void up(Schema schema) {
+    schema.create('world', (table) {
+      table.integer('id');
+      table.integer('randomNumber');
+    });
+  }
+
+  @override
+  void down(Schema schema) {
+    schema.drop('world');
+  }
+}
+
+// **************************************************************************
+// OrmGenerator
+// **************************************************************************
+
+class WorldQuery extends Query<World, WorldQueryWhere> {
+  WorldQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
+    trampoline ??= <String>{};
+    trampoline.add(tableName);
+    _where = WorldQueryWhere(this);
+  }
+
+  @override
+  final WorldQueryValues values = WorldQueryValues();
+
+  WorldQueryWhere? _where;
+
+  @override
+  Map<String, String> get casts {
+    return {};
+  }
+
+  @override
+  String get tableName {
+    return 'world';
+  }
+
+  @override
+  List<String> get fields {
+    return const ['id', 'randomNumber'];
+  }
+
+  @override
+  WorldQueryWhere? get where {
+    return _where;
+  }
+
+  @override
+  WorldQueryWhere newWhereClause() {
+    return WorldQueryWhere(this);
+  }
+
+  static World? parseRow(List row) {
+    if (row.every((x) => x == null)) {
+      return null;
+    }
+    var model = World(id: (row[0] as int?), randomNumber: (row[1] as int?));
+    return model;
+  }
+
+  @override
+  Optional<World> deserialize(List row) {
+    return Optional.ofNullable(parseRow(row));
+  }
+}
+
+class WorldQueryWhere extends QueryWhere {
+  WorldQueryWhere(WorldQuery query)
+      : id = NumericSqlExpressionBuilder<int>(query, 'id'),
+        randomNumber = NumericSqlExpressionBuilder<int>(query, 'randomNumber');
+
+  final NumericSqlExpressionBuilder<int> id;
+
+  final NumericSqlExpressionBuilder<int> randomNumber;
+
+  @override
+  List<SqlExpressionBuilder> get expressionBuilders {
+    return [id, randomNumber];
+  }
+}
+
+class WorldQueryValues extends MapQueryValues {
+  @override
+  Map<String, String> get casts {
+    return {};
+  }
+
+  int? get id {
+    return (values['id'] as int?);
+  }
+
+  set id(int? value) => values['id'] = value;
+  int? get randomNumber {
+    return (values['randomNumber'] as int?);
+  }
+
+  set randomNumber(int? value) => values['randomNumber'] = value;
+  void copyFrom(World model) {
+    id = model.id;
+    randomNumber = model.randomNumber;
+  }
+}
+
+// **************************************************************************
+// JsonModelGenerator
+// **************************************************************************
+
+@generatedSerializable
+class World extends _World {
+  World({this.id, this.randomNumber});
+
+  @override
+  int? id;
+
+  @override
+  int? randomNumber;
+
+  World copyWith({int? id, int? randomNumber}) {
+    return World(
+        id: id ?? this.id, randomNumber: randomNumber ?? this.randomNumber);
+  }
+
+  @override
+  bool operator ==(other) {
+    return other is _World &&
+        other.id == id &&
+        other.randomNumber == randomNumber;
+  }
+
+  @override
+  int get hashCode {
+    return hashObjects([id, randomNumber]);
+  }
+
+  @override
+  String toString() {
+    return 'World(id=$id, randomNumber=$randomNumber)';
+  }
+
+  Map<String, dynamic> toJson() {
+    return WorldSerializer.toMap(this);
+  }
+}
+
+// **************************************************************************
+// SerializerGenerator
+// **************************************************************************
+
+const WorldSerializer worldSerializer = WorldSerializer();
+
+class WorldEncoder extends Converter<World, Map> {
+  const WorldEncoder();
+
+  @override
+  Map convert(World model) => WorldSerializer.toMap(model);
+}
+
+class WorldDecoder extends Converter<Map, World> {
+  const WorldDecoder();
+
+  @override
+  World convert(Map map) => WorldSerializer.fromMap(map);
+}
+
+class WorldSerializer extends Codec<World, Map> {
+  const WorldSerializer();
+
+  @override
+  WorldEncoder get encoder => const WorldEncoder();
+  @override
+  WorldDecoder get decoder => const WorldDecoder();
+  static World fromMap(Map map) {
+    return World(
+        id: map['id'] as int?, randomNumber: map['randomNumber'] as int?);
+  }
+
+  static Map<String, dynamic> toMap(_World? model) {
+    if (model == null) {
+      return {};
+    }
+    return {'id': model.id, 'randomNumber': model.randomNumber};
+  }
+}
+
+abstract class WorldFields {
+  static const List<String> allFields = <String>[id, randomNumber];
+
+  static const String id = 'id';
+
+  static const String randomNumber = 'randomNumber';
+}

+ 120 - 0
frameworks/Dart/angel3/orm/lib/src/routes/controllers/controllers.dart

@@ -0,0 +1,120 @@
+import 'dart:async';
+import 'dart:math';
+import 'package:angel3_framework/angel3_framework.dart';
+import 'package:angel3_orm/angel3_orm.dart';
+import 'package:optional/optional.dart';
+import '../../models/fortune.dart';
+import '../../models/world.dart';
+
+Future configureServer(Angel app) async {
+  /// Controllers will not function unless wired to the application!
+
+  var executor = app.container!.make<QueryExecutor>();
+
+  // Generate a random number between 1 and 10000
+  int _genRandomId() {
+    var rand = Random();
+    return rand.nextInt(10000) + 1;
+  }
+
+  int _parseQueryCount(String? count) {
+    if (count == null) {
+      return 1;
+    }
+
+    var limit = int.tryParse(count) ?? 0;
+    if (limit < 1) return 1;
+
+    if (limit > 500) return 500;
+
+    return limit;
+  }
+
+  List<int> _generateIds(int maxCount) {
+    var result = <int>[];
+
+    while (result.length < maxCount) {
+      var id = _genRandomId();
+      if (!result.contains(id)) {
+        result.add(id);
+      }
+    }
+
+    return result;
+  }
+
+  // Return data in json
+  app.get('/json', (req, res) async {
+    res.json({'message': 'Hello, World!'});
+  });
+
+  // Return data in plaintext
+  app.get('/plaintext', (req, res) async {
+    res.write('Hello, World!');
+    res.close();
+  });
+
+  // Add an entry and sort a list of fortune
+  app.get('/fortunes', (req, res) async {
+    var list = await FortuneQuery().get(executor);
+
+    list.add(
+        Fortune(id: 0, message: 'Additional fortune added at request time.'));
+    list.sort((a, b) => a.message?.compareTo(b.message ?? '') ?? 0);
+
+    //res.json(list);
+    await res.render('listing', {'fortunes': list});
+  });
+
+  // Find a random World
+  app.get('/db', (req, res) async {
+    var id = _genRandomId();
+    var query = WorldQuery()..where?.id.equals(id);
+    var result = await query.get(executor);
+    if (result.isNotEmpty) {
+      res.json(result[0]);
+    } else {
+      res.json({});
+    }
+  });
+
+  // Return a list of worlds
+  app.get('/query', (req, res) async {
+    var params = req.queryParameters;
+
+    var queryLimit = _parseQueryCount(params['queries'] as String?);
+
+    var list = _generateIds(queryLimit);
+    var query = WorldQuery();
+    var result = <World>[];
+    for (var id in list) {
+      query.where?.id.equals(id);
+      var optWorld = await query.getOne(executor);
+      result.add(optWorld.value);
+    }
+
+    res.json(result);
+  });
+
+  // Update a list of worlds
+  app.get('/updates', (req, res) async {
+    var params = req.queryParameters;
+    var queryLimit = _parseQueryCount(params['queries'] as String?);
+    var listOfIds = _generateIds(queryLimit);
+
+    var query = WorldQuery();
+    var result = <World>[];
+    for (var id in listOfIds) {
+      query.where?.id.equals(id);
+      var optWorld = await query.getOne(executor);
+
+      query
+        ..where?.id.equals(optWorld.value.id!)
+        ..values.randomNumber = _genRandomId();
+      var updatedRec = await query.updateOne(executor);
+      result.add(updatedRec.value);
+    }
+
+    res.json(result);
+  });
+}

+ 60 - 0
frameworks/Dart/angel3/orm/lib/src/routes/routes.dart

@@ -0,0 +1,60 @@
+/// This app's route configuration.
+import 'package:angel3_framework/angel3_framework.dart';
+import 'package:angel3_static/angel3_static.dart';
+import 'package:file/file.dart';
+import 'controllers/controllers.dart' as controllers;
+
+/// Put your app routes here!
+///
+/// See the wiki for information about routing, requests, and responses:
+/// * https://angel3-docs.dukefirehawk.com/guides/basic-routing
+/// * https://angel3-docs.dukefirehawk.com/guides/requests-and-responses
+AngelConfigurer configureServer(FileSystem fileSystem) {
+  return (Angel app) async {
+    // Typically, you want to mount controllers first, after any global middleware.
+    await app.configure(controllers.configureServer);
+
+    // Render `views/hello.jl` when a user visits the application root.
+    app.get('/', (req, res) => res.render('hello'));
+
+    // Mount static server at web in development.
+    // The `CachingVirtualDirectory` variant of `VirtualDirectory` also sends `Cache-Control` headers.
+    //
+    // In production, however, prefer serving static files through NGINX or a
+    // similar reverse proxy.
+    //
+    // Read the following two sources for documentation:
+    // * https://medium.com/the-angel-framework/serving-static-files-with-the-angel-framework-2ddc7a2b84ae
+    // * https://pub.dev/packages/angel3_static
+    if (!app.environment.isProduction) {
+      var vDir = VirtualDirectory(
+        app,
+        fileSystem,
+        source: fileSystem.directory('web'),
+      );
+      app.fallback(vDir.handleRequest);
+    }
+
+    // Throw a 404 if no route matched the request.
+    app.fallback((req, res) => throw AngelHttpException.notFound());
+
+    // Set our application up to handle different errors.
+    //
+    // Read the following for documentation:
+    // * https://angel3-docs.dukefirehawk.com/guides/error-handling
+
+    var oldErrorHandler = app.errorHandler;
+    app.errorHandler = (e, req, res) async {
+      if (req.accepts('text/html', strict: true)) {
+        if (e.statusCode == 404 && req.accepts('text/html', strict: true)) {
+          await res
+              .render('error', {'message': 'No file exists at ${req.uri}.'});
+        } else {
+          await res.render('error', {'message': e.message});
+        }
+      } else {
+        return await oldErrorHandler(e, req, res);
+      }
+    };
+  };
+}

+ 13 - 0
frameworks/Dart/angel3/orm/lib/src/services/services.dart

@@ -0,0 +1,13 @@
+/// Declare services here!
+import 'dart:async';
+import 'package:angel3_framework/angel3_framework.dart';
+
+/// Configure our application to use *services*.
+/// Services must be wired to the app via `app.use`.
+///
+/// They provide many benefits, such as instant REST API generation,
+/// and respond to both REST and WebSockets.
+///
+/// Read more here:
+/// https://github.com/angel-dart/angel/wiki/Service-Basics
+Future configureServer(Angel app) async {}

+ 838 - 0
frameworks/Dart/angel3/orm/pubspec.lock

@@ -0,0 +1,838 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+  _fe_analyzer_shared:
+    dependency: transitive
+    description:
+      name: _fe_analyzer_shared
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "30.0.0"
+  analyzer:
+    dependency: transitive
+    description:
+      name: analyzer
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.7.0"
+  angel3_auth:
+    dependency: "direct main"
+    description:
+      name: angel3_auth
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.2"
+  angel3_client:
+    dependency: transitive
+    description:
+      name: angel3_client
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.0"
+  angel3_configuration:
+    dependency: "direct main"
+    description:
+      name: angel3_configuration
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.0"
+  angel3_container:
+    dependency: transitive
+    description:
+      name: angel3_container
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.1"
+  angel3_framework:
+    dependency: "direct main"
+    description:
+      name: angel3_framework
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.2"
+  angel3_hot:
+    dependency: "direct dev"
+    description:
+      name: angel3_hot
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.2"
+  angel3_http_exception:
+    dependency: transitive
+    description:
+      name: angel3_http_exception
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.2"
+  angel3_jael:
+    dependency: "direct main"
+    description:
+      name: angel3_jael
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.1"
+  angel3_migration:
+    dependency: "direct main"
+    description:
+      name: angel3_migration
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.0"
+  angel3_migration_runner:
+    dependency: "direct dev"
+    description:
+      name: angel3_migration_runner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.0"
+  angel3_mock_request:
+    dependency: transitive
+    description:
+      name: angel3_mock_request
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.2"
+  angel3_model:
+    dependency: transitive
+    description:
+      name: angel3_model
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.0"
+  angel3_orm:
+    dependency: "direct main"
+    description:
+      name: angel3_orm
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.1"
+  angel3_orm_generator:
+    dependency: "direct dev"
+    description:
+      name: angel3_orm_generator
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.1"
+  angel3_orm_postgres:
+    dependency: "direct main"
+    description:
+      name: angel3_orm_postgres
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.0"
+  angel3_production:
+    dependency: "direct main"
+    description:
+      name: angel3_production
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.1"
+  angel3_route:
+    dependency: transitive
+    description:
+      name: angel3_route
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "5.2.0"
+  angel3_serialize:
+    dependency: "direct main"
+    description:
+      name: angel3_serialize
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.0"
+  angel3_serialize_generator:
+    dependency: "direct dev"
+    description:
+      name: angel3_serialize_generator
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.3.0"
+  angel3_static:
+    dependency: "direct main"
+    description:
+      name: angel3_static
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.0"
+  angel3_test:
+    dependency: "direct dev"
+    description:
+      name: angel3_test
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.1"
+  angel3_validate:
+    dependency: "direct main"
+    description:
+      name: angel3_validate
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.2"
+  angel3_websocket:
+    dependency: transitive
+    description:
+      name: angel3_websocket
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.2"
+  args:
+    dependency: transitive
+    description:
+      name: args
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.3.0"
+  async:
+    dependency: transitive
+    description:
+      name: async
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.8.2"
+  belatuk_code_buffer:
+    dependency: transitive
+    description:
+      name: belatuk_code_buffer
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.2"
+  belatuk_combinator:
+    dependency: transitive
+    description:
+      name: belatuk_combinator
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  belatuk_html_builder:
+    dependency: transitive
+    description:
+      name: belatuk_html_builder
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.2"
+  belatuk_http_server:
+    dependency: transitive
+    description:
+      name: belatuk_http_server
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  belatuk_json_serializer:
+    dependency: transitive
+    description:
+      name: belatuk_json_serializer
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "5.0.0"
+  belatuk_merge_map:
+    dependency: transitive
+    description:
+      name: belatuk_merge_map
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.2"
+  belatuk_pretty_logging:
+    dependency: "direct main"
+    description:
+      name: belatuk_pretty_logging
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.0"
+  belatuk_pub_sub:
+    dependency: transitive
+    description:
+      name: belatuk_pub_sub
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.3"
+  belatuk_range_header:
+    dependency: transitive
+    description:
+      name: belatuk_range_header
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.1"
+  belatuk_symbol_table:
+    dependency: transitive
+    description:
+      name: belatuk_symbol_table
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  boolean_selector:
+    dependency: transitive
+    description:
+      name: boolean_selector
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  buffer:
+    dependency: transitive
+    description:
+      name: buffer
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.1"
+  build:
+    dependency: transitive
+    description:
+      name: build
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.1"
+  build_config:
+    dependency: transitive
+    description:
+      name: build_config
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  build_daemon:
+    dependency: transitive
+    description:
+      name: build_daemon
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  build_resolvers:
+    dependency: transitive
+    description:
+      name: build_resolvers
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.5"
+  build_runner:
+    dependency: "direct dev"
+    description:
+      name: build_runner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.5"
+  build_runner_core:
+    dependency: transitive
+    description:
+      name: build_runner_core
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "7.2.2"
+  built_collection:
+    dependency: transitive
+    description:
+      name: built_collection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "5.1.1"
+  built_value:
+    dependency: transitive
+    description:
+      name: built_value
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "8.1.3"
+  charcode:
+    dependency: transitive
+    description:
+      name: charcode
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.1"
+  checked_yaml:
+    dependency: transitive
+    description:
+      name: checked_yaml
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.1"
+  cli_util:
+    dependency: transitive
+    description:
+      name: cli_util
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.3.5"
+  clock:
+    dependency: transitive
+    description:
+      name: clock
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  code_builder:
+    dependency: transitive
+    description:
+      name: code_builder
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.1.0"
+  collection:
+    dependency: transitive
+    description:
+      name: collection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.15.0"
+  convert:
+    dependency: transitive
+    description:
+      name: convert
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  coverage:
+    dependency: transitive
+    description:
+      name: coverage
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.3"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  dart_style:
+    dependency: transitive
+    description:
+      name: dart_style
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.2.0"
+  dotenv:
+    dependency: transitive
+    description:
+      name: dotenv
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.0"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "6.1.2"
+  fixnum:
+    dependency: transitive
+    description:
+      name: fixnum
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  frontend_server_client:
+    dependency: transitive
+    description:
+      name: frontend_server_client
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.2"
+  glob:
+    dependency: transitive
+    description:
+      name: glob
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.2"
+  graphs:
+    dependency: transitive
+    description:
+      name: graphs
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  http:
+    dependency: transitive
+    description:
+      name: http
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.13.4"
+  http2:
+    dependency: transitive
+    description:
+      name: http2
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.0"
+  http_multi_server:
+    dependency: transitive
+    description:
+      name: http_multi_server
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.0"
+  inflection3:
+    dependency: transitive
+    description:
+      name: inflection3
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.5.3+2"
+  intl:
+    dependency: transitive
+    description:
+      name: intl
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.17.0"
+  io:
+    dependency: "direct dev"
+    description:
+      name: io
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.3"
+  jael3:
+    dependency: transitive
+    description:
+      name: jael3
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.0"
+  jael3_preprocessor:
+    dependency: transitive
+    description:
+      name: jael3_preprocessor
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.0"
+  js:
+    dependency: transitive
+    description:
+      name: js
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.6.3"
+  json_annotation:
+    dependency: transitive
+    description:
+      name: json_annotation
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.3.0"
+  json_rpc_2:
+    dependency: transitive
+    description:
+      name: json_rpc_2
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
+  lints:
+    dependency: "direct dev"
+    description:
+      name: lints
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
+  logging:
+    dependency: "direct main"
+    description:
+      name: logging
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.2"
+  matcher:
+    dependency: transitive
+    description:
+      name: matcher
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.12.11"
+  meta:
+    dependency: transitive
+    description:
+      name: meta
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.7.0"
+  mime:
+    dependency: transitive
+    description:
+      name: mime
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
+  node_preamble:
+    dependency: transitive
+    description:
+      name: node_preamble
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.1"
+  optional:
+    dependency: "direct main"
+    description:
+      name: optional
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "6.1.0+1"
+  package_config:
+    dependency: transitive
+    description:
+      name: package_config
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.2"
+  path:
+    dependency: transitive
+    description:
+      name: path
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.8.0"
+  pedantic:
+    dependency: transitive
+    description:
+      name: pedantic
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.11.1"
+  pool:
+    dependency: transitive
+    description:
+      name: pool
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.5.0"
+  postgres:
+    dependency: transitive
+    description:
+      name: postgres
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.4.2"
+  pub_semver:
+    dependency: transitive
+    description:
+      name: pub_semver
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  pubspec_parse:
+    dependency: transitive
+    description:
+      name: pubspec_parse
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  quiver:
+    dependency: transitive
+    description:
+      name: quiver
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1+1"
+  recase:
+    dependency: transitive
+    description:
+      name: recase
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.0"
+  sasl_scram:
+    dependency: transitive
+    description:
+      name: sasl_scram
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.1.0"
+  saslprep:
+    dependency: transitive
+    description:
+      name: saslprep
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.2"
+  shelf:
+    dependency: transitive
+    description:
+      name: shelf
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.0"
+  shelf_packages_handler:
+    dependency: transitive
+    description:
+      name: shelf_packages_handler
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.0"
+  shelf_static:
+    dependency: transitive
+    description:
+      name: shelf_static
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  shelf_web_socket:
+    dependency: transitive
+    description:
+      name: shelf_web_socket
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
+  source_gen:
+    dependency: transitive
+    description:
+      name: source_gen
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.1"
+  source_map_stack_trace:
+    dependency: transitive
+    description:
+      name: source_map_stack_trace
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  source_maps:
+    dependency: transitive
+    description:
+      name: source_maps
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.10.10"
+  source_span:
+    dependency: transitive
+    description:
+      name: source_span
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.8.1"
+  stack_trace:
+    dependency: transitive
+    description:
+      name: stack_trace
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.10.0"
+  stream_channel:
+    dependency: transitive
+    description:
+      name: stream_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  stream_transform:
+    dependency: transitive
+    description:
+      name: stream_transform
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.0"
+  string_scanner:
+    dependency: transitive
+    description:
+      name: string_scanner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
+  term_glyph:
+    dependency: transitive
+    description:
+      name: term_glyph
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.2.0"
+  test:
+    dependency: "direct dev"
+    description:
+      name: test
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.19.4"
+  test_api:
+    dependency: transitive
+    description:
+      name: test_api
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.4.8"
+  test_core:
+    dependency: transitive
+    description:
+      name: test_core
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.4.9"
+  timing:
+    dependency: transitive
+    description:
+      name: timing
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  tuple:
+    dependency: transitive
+    description:
+      name: tuple
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.0"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.0"
+  unorm_dart:
+    dependency: transitive
+    description:
+      name: unorm_dart
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.0"
+  uuid:
+    dependency: transitive
+    description:
+      name: uuid
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.5"
+  vm_service:
+    dependency: transitive
+    description:
+      name: vm_service
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "7.5.0"
+  watcher:
+    dependency: transitive
+    description:
+      name: watcher
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
+  web_socket_channel:
+    dependency: transitive
+    description:
+      name: web_socket_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  webkit_inspection_protocol:
+    dependency: transitive
+    description:
+      name: webkit_inspection_protocol
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  yaml:
+    dependency: transitive
+    description:
+      name: yaml
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.0"
+sdks:
+  dart: ">=2.14.0 <3.0.0"

+ 31 - 0
frameworks/Dart/angel3/orm/pubspec.yaml

@@ -0,0 +1,31 @@
+name: benchmark_app
+version: 1.0.0
+description: A basic starter application template for Angel3 framework
+publish_to: none
+environment:
+  sdk: '>=2.12.0 <3.0.0'
+dependencies:
+  angel3_auth: ^4.0.0
+  angel3_configuration: ^4.1.0
+  angel3_framework: ^4.2.0
+  angel3_jael: ^4.2.0
+  angel3_migration: ^4.0.0
+  angel3_orm: ^4.0.0
+  angel3_orm_postgres: ^3.0.0
+  angel3_serialize: ^4.1.0
+  angel3_production: ^3.1.0
+  angel3_static: ^4.1.0
+  angel3_validate: ^4.0.0
+  belatuk_pretty_logging: ^4.0.0
+  optional: ^6.0.0
+  logging: ^1.0.0
+dev_dependencies:
+  angel3_hot: ^4.2.0
+  angel3_migration_runner: ^4.0.0
+  angel3_orm_generator: ^4.1.0
+  angel3_serialize_generator: ^4.2.0
+  angel3_test: ^4.0.0
+  build_runner: ^2.0.3
+  io: ^1.0.0
+  test: ^1.17.5
+  lints: ^1.0.0

+ 29 - 0
frameworks/Dart/angel3/orm/run/prod.dart

@@ -0,0 +1,29 @@
+import 'package:angel3_container/mirrors.dart';
+import 'package:angel3_production/angel3_production.dart';
+import 'package:benchmark_app/benchmark_app.dart';
+
+// NOTE: By default, the Runner class does not use the `MirrorsReflector`, or any
+// reflector, by default.
+//
+// If your application is using any sort of functionality reliant on annotations or reflection,
+// either include the MirrorsReflector, or use a static reflector variant.
+//
+// The following use cases require reflection:
+// * Use of Controllers, via @Expose() or @ExposeWS()
+// * Use of dependency injection into constructors, whether in controllers or plain `container.make` calls
+// * Use of the `ioc` function in any route
+//
+// The `MirrorsReflector` from `package:angel_container/mirrors.dart` is by far the most convenient pattern,
+// so use it if possible.
+//
+// However, the following alternatives exist:
+// * Generation via `package:angel_container_generator`
+// * Creating an instance of `StaticReflector`
+// * Manually implementing the `Reflector` interface (cumbersome; not recommended)
+//
+// As of January 4th, 2018, the documentation has not yet been updated to state this,
+// so in the meantime, visit the Angel chat for further questions:
+//
+// https://gitter.im/angel_dart/discussion
+void main(List<String> args) =>
+    Runner('Angel3', configureServer, reflector: MirrorsReflector()).run(args);

+ 5 - 0
frameworks/Dart/angel3/orm/views/error.jael

@@ -0,0 +1,5 @@
+<extend src="layout.jael">
+    <block name="content">
+        <div class="title">{{ message }}</div>
+    </block>
+</extend>

+ 5 - 0
frameworks/Dart/angel3/orm/views/hello.jael

@@ -0,0 +1,5 @@
+<extend src="layout.jael">
+    <block name="content">
+        <div class="title">Angel3</div>
+    </block>
+</extend>

+ 17 - 0
frameworks/Dart/angel3/orm/views/layout.jael

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>{{ title ?? 'Angel3' }}</title>
+
+    <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
+    <link rel="stylesheet" href="/css/site.css">
+    <link rel="icon" href="/images/favicon.png">
+</head>
+<body>
+<div class="container">
+    <div class="content">
+        <block name="content"></block>
+    </div>
+</div>
+</body>
+</html>

+ 14 - 0
frameworks/Dart/angel3/orm/views/listing.jael

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Fortunes</title>
+  </head>
+  <body>
+    <table><tr><th>id</th><th>message</th></tr>
+      <tr for-each=fortunes as="item">
+        <td>{{item.id}}</td>
+        <td>{{item.message}}</td>
+      </tr>
+    </table>
+  </body>
+</html>

+ 27 - 0
frameworks/Dart/angel3/orm/web/css/site.css

@@ -0,0 +1,27 @@
+html, body {
+    height: 100%;
+}
+
+body {
+    margin: 0;
+    padding: 0;
+    width: 100%;
+    display: table;
+    font-weight: 100;
+    font-family: 'Lato', sans-serif;
+}
+
+.container {
+    text-align: center;
+    display: table-cell;
+    vertical-align: middle;
+}
+
+.content {
+    text-align: center;
+    display: inline-block;
+}
+
+.title {
+    font-size: 96px;
+}

BIN
frameworks/Dart/angel3/orm/web/images/favicon.png


+ 2 - 0
frameworks/Dart/angel3/orm/web/robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /admin

+ 1 - 1
frameworks/Go/atreugo/atreugo-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.16
+FROM golang:1.17
 
 WORKDIR /atreugo
 

+ 1 - 1
frameworks/Go/atreugo/atreugo.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.16
+FROM golang:1.17
 
 WORKDIR /atreugo
 

+ 25 - 4
frameworks/Go/atreugo/src/go.mod

@@ -1,9 +1,30 @@
 module atreugo/src
 
-go 1.16
+go 1.17
 
 require (
-	github.com/jackc/pgx/v4 v4.13.0
-	github.com/savsgio/atreugo/v11 v11.8.1
-	github.com/valyala/quicktemplate v1.6.3
+	github.com/jackc/pgx/v4 v4.14.1
+	github.com/savsgio/atreugo/v11 v11.8.4
+	github.com/valyala/quicktemplate v1.7.0
+)
+
+require (
+	github.com/andybalholm/brotli v1.0.3 // indirect
+	github.com/fasthttp/router v1.4.4 // indirect
+	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+	github.com/jackc/pgconn v1.10.1 // indirect
+	github.com/jackc/pgio v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgproto3/v2 v2.2.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
+	github.com/jackc/pgtype v1.9.1 // indirect
+	github.com/jackc/puddle v1.2.0 // indirect
+	github.com/klauspost/compress v1.13.5 // indirect
+	github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4 // indirect
+	github.com/valyala/bytebufferpool v1.0.0 // indirect
+	github.com/valyala/fasthttp v1.31.0 // indirect
+	github.com/valyala/tcplisten v1.0.0 // indirect
+	golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
+	golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
+	golang.org/x/text v0.3.6 // indirect
 )

+ 27 - 32
frameworks/Go/atreugo/src/go.sum

@@ -1,8 +1,8 @@
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E=
 github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM=
+github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 github.com/atreugo/mock v0.0.0-20200601091009-13c275b330b0 h1:IVqe9WnancrkICl5HqEfGjrnkQ4+VsU5fodcuFVoG/A=
 github.com/atreugo/mock v0.0.0-20200601091009-13c275b330b0/go.mod h1:HTHAc8RoZXMVTr6wZQN7Jjm3mYMnbfkqqKdnQgSoe9o=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
@@ -13,8 +13,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/fasthttp/router v1.4.1 h1:3xPUO+hy/HAkgGDSd5sX5w18cyGDIFbC7vip8KwPDk8=
-github.com/fasthttp/router v1.4.1/go.mod h1:4P0Kq4C882tA2evBKDW7De7hGfWmvV8FN+zqt8Lu49Q=
+github.com/fasthttp/router v1.4.4 h1:Z025tHFTjDp6T6QMBjloyGL6KV5wtakW365K/7KiE1c=
+github.com/fasthttp/router v1.4.4/go.mod h1:TiyF2kc+mogKcTxqkhUbiXpwklouv5dN58A0ZUo8J6s=
 github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -22,8 +22,7 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh
 github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
 github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
@@ -34,8 +33,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU
 github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
 github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
 github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
-github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU=
-github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.10.1 h1:DzdIHIjG1AxGwoEEqS+mGsURyjt4enSmqzACXvVzOT8=
+github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
 github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
 github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
 github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
@@ -44,38 +43,38 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W
 github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
 github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
-github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
 github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
 github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
 github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
 github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI=
 github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns=
+github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
 github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
 github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
 github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
 github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
 github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
-github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs=
-github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgtype v1.9.1 h1:MJc2s0MFS8C3ok1wQTdQxWuXQcB6+HwAm5x1CzW7mf0=
+github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
 github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
 github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
-github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570=
-github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0=
+github.com/jackc/pgx/v4 v4.14.1 h1:71oo1KAGI6mXhLiTMn6iDFcp3e7+zon/capWjl2OEFU=
+github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M=
 github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
-github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94=
 github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.2.0 h1:DNDKdn/pDrWvDWyT2FYvpZVE81OAhWrjCv19I9n108Q=
+github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8=
-github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.5 h1:9O69jUPDcsT9fEm74W92rZL9FQY7rCdaXVneq+yyzl4=
+github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -101,10 +100,10 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/savsgio/atreugo/v11 v11.8.1 h1:C9PJFhauDWGMDNfdCeicabxDFt9wvD+t/BcCMWpqbus=
-github.com/savsgio/atreugo/v11 v11.8.1/go.mod h1:55xyLd1I0RXKhgVUSvAcjqWnCOVnhpjxTFRFnfFN5SI=
-github.com/savsgio/gotils v0.0.0-20210617111740-97865ed5a873 h1:N3Af8f13ooDKcIhsmFT7Z05CStZWu4C7Md0uDEy4q6o=
-github.com/savsgio/gotils v0.0.0-20210617111740-97865ed5a873/go.mod h1:dmPawKuiAeG/aFYVs2i+Dyosoo7FNcm+Pi8iK6ZUrX8=
+github.com/savsgio/atreugo/v11 v11.8.4 h1:QyqrPuhzlYPncHhGIzFDguAIKGt/WMX9KOL+pU79deo=
+github.com/savsgio/atreugo/v11 v11.8.4/go.mod h1:ut9nYMjuyD3hKjjoTLEHLaWFrWH3z6ZbtQIyRbXdFhU=
+github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4 h1:ocK/D6lCgLji37Z2so4xhMl46se1ntReQQCUIU4BWI8=
+github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4/go.mod h1:oejLrk1Y/5zOF+c/aHtXqn3TFlzzbAgPWg8zBiAHDas=
 github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
 github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
@@ -121,12 +120,11 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
-github.com/valyala/fasthttp v1.28.0 h1:ruVmTmZaBR5i67NqnjvvH5gEv0zwHfWtbjoyW98iho4=
-github.com/valyala/fasthttp v1.28.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
-github.com/valyala/quicktemplate v1.6.3 h1:O7EuMwuH7Q94U2CXD6sOX8AYHqQqWtmIk690IhmpkKA=
-github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY=
-github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/fasthttp v1.31.0 h1:lrauRLII19afgCs2fnWRJ4M5IkV0lo2FqA61uGkNBfE=
+github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM=
+github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8=
 github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
 github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
 github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
@@ -159,7 +157,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -173,8 +170,6 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

+ 1 - 1
frameworks/Go/fasthttp/fasthttp-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.16
+FROM golang:1.17
 
 WORKDIR /fasthttp
 

+ 1 - 1
frameworks/Go/fasthttp/fasthttp.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.16
+FROM golang:1.17
 
 WORKDIR /fasthttp
 

+ 23 - 5
frameworks/Go/fasthttp/src/go.mod

@@ -1,10 +1,28 @@
 module fasthttp/src
 
-go 1.16
+go 1.17
 
 require (
-	github.com/jackc/pgx/v4 v4.13.0
-	github.com/savsgio/gotils v0.0.0-20210617111740-97865ed5a873
-	github.com/valyala/fasthttp v1.28.0
-	github.com/valyala/quicktemplate v1.6.3
+	github.com/jackc/pgx/v4 v4.14.1
+	github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899
+	github.com/valyala/fasthttp v1.31.0
+	github.com/valyala/quicktemplate v1.7.0
+)
+
+require (
+	github.com/andybalholm/brotli v1.0.4 // indirect
+	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+	github.com/jackc/pgconn v1.10.1 // indirect
+	github.com/jackc/pgio v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgproto3/v2 v2.2.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
+	github.com/jackc/pgtype v1.9.1 // indirect
+	github.com/jackc/puddle v1.2.1 // indirect
+	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/valyala/bytebufferpool v1.0.0 // indirect
+	github.com/valyala/tcplisten v1.0.0 // indirect
+	golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
+	golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
+	golang.org/x/text v0.3.7 // indirect
 )

+ 32 - 31
frameworks/Go/fasthttp/src/go.sum

@@ -1,8 +1,9 @@
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E=
 github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
+github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
@@ -18,8 +19,7 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh
 github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
 github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
@@ -30,8 +30,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU
 github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
 github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
 github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
-github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU=
-github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.10.1 h1:DzdIHIjG1AxGwoEEqS+mGsURyjt4enSmqzACXvVzOT8=
+github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
 github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
 github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
 github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
@@ -40,38 +40,40 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W
 github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
 github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
-github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
 github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
 github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
 github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
 github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI=
 github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns=
+github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
 github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
 github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
 github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
 github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
 github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
-github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs=
-github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgtype v1.9.1 h1:MJc2s0MFS8C3ok1wQTdQxWuXQcB6+HwAm5x1CzW7mf0=
+github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
 github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
 github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
-github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570=
-github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0=
+github.com/jackc/pgx/v4 v4.14.1 h1:71oo1KAGI6mXhLiTMn6iDFcp3e7+zon/capWjl2OEFU=
+github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M=
 github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
-github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94=
 github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw=
+github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8=
-github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -97,8 +99,8 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/savsgio/gotils v0.0.0-20210617111740-97865ed5a873 h1:N3Af8f13ooDKcIhsmFT7Z05CStZWu4C7Md0uDEy4q6o=
-github.com/savsgio/gotils v0.0.0-20210617111740-97865ed5a873/go.mod h1:dmPawKuiAeG/aFYVs2i+Dyosoo7FNcm+Pi8iK6ZUrX8=
+github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899 h1:Orn7s+r1raRTBKLSc9DmbktTT04sL+vkzsbRD2Q8rOI=
+github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899/go.mod h1:oejLrk1Y/5zOF+c/aHtXqn3TFlzzbAgPWg8zBiAHDas=
 github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
 github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
@@ -115,12 +117,11 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
-github.com/valyala/fasthttp v1.28.0 h1:ruVmTmZaBR5i67NqnjvvH5gEv0zwHfWtbjoyW98iho4=
-github.com/valyala/fasthttp v1.28.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
-github.com/valyala/quicktemplate v1.6.3 h1:O7EuMwuH7Q94U2CXD6sOX8AYHqQqWtmIk690IhmpkKA=
-github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY=
-github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/fasthttp v1.31.0 h1:lrauRLII19afgCs2fnWRJ4M5IkV0lo2FqA61uGkNBfE=
+github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM=
+github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8=
 github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
 github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
 github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
@@ -144,8 +145,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -153,7 +155,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -167,21 +168,21 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=

+ 1 - 6
frameworks/Java/isocket-nio/pom.xml

@@ -9,7 +9,7 @@
     <properties>
         <slf4j.version>1.7.7</slf4j.version>
         <log4j.version>1.2.17</log4j.version>
-        <log4j2.version>2.7</log4j2.version>
+        <log4j2.version>2.17.0</log4j2.version>
         <isocket.version>1.0.3-SNAPSHOT</isocket.version>
         <fastjson.version>1.2.44</fastjson.version>
     </properties>
@@ -45,11 +45,6 @@
             <version>${slf4j.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <version>${log4j2.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-api</artifactId>

+ 4 - 0
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/Consts.java

@@ -5,4 +5,8 @@ public class Consts {
     public static final byte[] TEXT_TYPE = "text/plain".getBytes();
     public static final byte[] JSON_TYPE = "application/json".getBytes();
 
+    public static final String URL_TEXT_PLAIN = "/plaintext";
+    public static final String URL_JSON = "/json";
+    public static final String URL_STATE = "/state";
+
 }

+ 5 - 5
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/HttpBootstrap.java

@@ -8,6 +8,9 @@ import cn.ibaijia.tfb.protocol.SimpleHttpProtocol;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * @author longzl
+ */
 public class HttpBootstrap {
     private static final Logger logger = LoggerFactory.getLogger(HttpBootstrap.class);
 
@@ -22,14 +25,11 @@ public class HttpBootstrap {
                 logger.error("session on process error.", throwable);
             }
         });
-        int processorNumber = Runtime.getRuntime().availableProcessors();
-        server.setThreadNumber(processorNumber);
         server.setUseDirectBuffer(true);
-        server.setReadFirst(true);
         server.setUsePool(true);
-        server.setPoolPageSize(16 * 1024);
+        server.setPoolPageSize(32 * 1024);
         server.setBuffSize(1 * 1024);
-        server.setBacklog(1024 * 4);
+        server.setBacklog(16 * 1024);
         server.start();
     }
 

+ 19 - 4
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/http/HttpRequestEntity.java

@@ -7,6 +7,9 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
+/**
+ * @author longzl
+ */
 public class HttpRequestEntity extends HttpEntity {
 
 
@@ -18,15 +21,19 @@ public class HttpRequestEntity extends HttpEntity {
     public byte[] tmp;
 
 
-    //请求行
     public String method;
     public String url;
     public String protocol;
 
-    //请求体
+    /**
+     * 请求体
+     */
     public String body;
-    //第一次 请求header时解析 第一行不要
-    private Map<byte[], byte[]> headers = new HashMap<>();
+    private int count = 0;
+    /**
+     * 第一次 请求header时解析 第一行不要
+     */
+    private Map<byte[], byte[]> headers = new HashMap<>(8);
     private byte[] contentType = Consts.TEXT_TYPE;
 
     @Override
@@ -46,9 +53,17 @@ public class HttpRequestEntity extends HttpEntity {
 
     @Override
     public void setHeader(byte[] name, byte[] value) {
+        count ++;
         this.headers.put(name, value);
     }
 
+    public void printAllHeaders() {
+        for (Map.Entry<byte[], byte[]> entry : headers.entrySet()) {
+            System.out.println(count);
+            System.out.println(new String(entry.getKey()) + ":" + new String(entry.getValue()));
+        }
+    }
+
     @Override
     public void setContentType(String contentType) {
         this.contentType = contentType.getBytes();

+ 15 - 4
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/http/HttpResponseEntity.java

@@ -9,6 +9,9 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
+/**
+ * @author longzl
+ */
 public class HttpResponseEntity extends HttpEntity {
     private static final byte[] PROTOCOL = "HTTP/1.1 ".getBytes();
     private static final byte[] STATUS_200 = "200 OK".getBytes();
@@ -19,10 +22,14 @@ public class HttpResponseEntity extends HttpEntity {
     private static final byte[] CONTENT_TYPE_HEAD = "\r\nContent-Type:".getBytes();
 
     private byte[] contentType = Consts.TEXT_TYPE;
-    //响应体
+    /**
+     * 响应体
+     */
     public String body;
 
-    //请求头 或者 响应头
+    /**
+     * 请求头 或者 响应头
+     */
     public Map<byte[], byte[]> headers = new HashMap<>();
 
     @Override
@@ -78,8 +85,12 @@ public class HttpResponseEntity extends HttpEntity {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
         HttpResponseEntity that = (HttpResponseEntity) o;
         return Objects.equals(body, that.body) &&
                 Objects.equals(headers, that.headers);

+ 6 - 3
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/processor/PlanTextProcessor.java

@@ -10,6 +10,9 @@ import com.alibaba.fastjson.JSON;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * @author longzl
+ */
 public class PlanTextProcessor implements Processor<HttpEntity> {
     private static final Logger logger = LoggerFactory.getLogger(PlanTextProcessor.class);
 
@@ -18,17 +21,17 @@ public class PlanTextProcessor implements Processor<HttpEntity> {
         HttpRequestEntity httpRequestEntity = (HttpRequestEntity) httpEntity;
         String url = httpRequestEntity.url;
         logger.trace("url:{}", url);
-        if ("/plaintext".equals(url)) {
+        if (Consts.URL_TEXT_PLAIN.equals(url)) {
             HttpResponseEntity httpResponseEntity = new HttpResponseEntity();
             httpResponseEntity.setContentType(Consts.TEXT_TYPE);
             httpResponseEntity.body = "Hello, World!";
             session.write(httpResponseEntity);
-        } else if ("/json".equals(url)) {
+        } else if (Consts.URL_JSON.equals(url)) {
             HttpResponseEntity httpResponseEntity = new HttpResponseEntity();
             httpResponseEntity.setContentType(Consts.JSON_TYPE);
             httpResponseEntity.body = JSON.toJSONString(new Message("Hello, World!"));
             session.write(httpResponseEntity);
-        } else if ("/state".equals(url)) {
+        } else if (Consts.URL_STATE.equals(url)) {
             HttpResponseEntity httpResponseEntity = new HttpResponseEntity();
             httpResponseEntity.setContentType(Consts.JSON_TYPE);
             State state = new State();

+ 17 - 8
frameworks/Java/isocket-nio/src/main/java/cn/ibaijia/tfb/protocol/SimpleHttpProtocol.java

@@ -11,14 +11,22 @@ import org.slf4j.LoggerFactory;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+/**
+ * @author longzl
+ */
 public class SimpleHttpProtocol implements Protocol<ByteBuffer, HttpEntity> {
 
     private static final Logger logger = LoggerFactory.getLogger(SimpleHttpProtocol.class);
-
-    private static final byte CR13 = (byte) 13; // \CR \r
-    private static final byte LF10 = (byte) 10; // \LF \n
-    private static final byte SPACE0 = (byte) 32; // \SP
-    private static final byte COLON = (byte) 58; // \:
+    /**
+     * CR13 \r
+     * LF10 \n
+     * SPACE0 \SP
+     * COLON :
+     */
+    private static final byte CR13 = (byte) 13;
+    private static final byte LF10 = (byte) 10;
+    private static final byte SPACE0 = (byte) 32;
+    private static final byte COLON = (byte) 58;
 
     private static final String httpEntityKey = "httpEntity";
 
@@ -36,8 +44,8 @@ public class SimpleHttpProtocol implements Protocol<ByteBuffer, HttpEntity> {
             httpEntity = new HttpRequestEntity();
             session.setAttribute(httpEntityKey, httpEntity);
         }
-
-        if (!httpEntity.headerComplete() && byteBuffer.hasRemaining()) { //解析header
+        //解析header
+        if (!httpEntity.headerComplete() && byteBuffer.hasRemaining()) {
             readHeader(byteBuffer, httpEntity);
         }
 
@@ -46,7 +54,8 @@ public class SimpleHttpProtocol implements Protocol<ByteBuffer, HttpEntity> {
                 session.setAttribute(httpEntityKey, null);
                 return httpEntity;
             }
-            if (httpEntity.bodyBuffer != null && byteBuffer.hasRemaining()) { // 解析request body
+            // 解析request body
+            if (httpEntity.bodyBuffer != null && byteBuffer.hasRemaining()) {
                 readBody(byteBuffer, httpEntity);
             }
         }

+ 1 - 1
frameworks/Java/netty/pom.xml

@@ -11,7 +11,7 @@
 	<properties>
 		<maven.compiler.source>11</maven.compiler.source>
 		<maven.compiler.target>11</maven.compiler.target>
-		<netty.version>4.1.65.Final</netty.version>
+		<netty.version>4.1.71.Final</netty.version>
 	</properties>
 
 	<packaging>jar</packaging>

+ 3 - 3
frameworks/Java/redkale/benchmark_config.json

@@ -110,9 +110,9 @@
             },
             "mongodb": {
                 "db_url": "/db",
-                "query_url": "/queries?q=", 
+                "query_url2": "/queries?q=", 
                 "fortune_url": "/fortunes",
-                "update_url": "/updates?q=",
+                "update_url2": "/updates?q=",
                 "port": 8080,
                 "approach": "Realistic",
                 "classification": "Fullstack",
@@ -131,4 +131,4 @@
             }
         }
     ]
-}
+}

+ 20 - 0
frameworks/Java/redkale/conf/persistence-mysql.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.0">
+    
+    <persistence-unit name=".read" transaction-type="RESOURCE_LOCAL">
+        <properties>
+            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://tfb-database:3306/hello_world?useSSL=false&amp;rewriteBatchedStatements=true&amp;serverTimezone=UTC&amp;characterEncoding=utf8"/>
+            <property name="javax.persistence.jdbc.user" value="benchmarkdbuser"/>
+            <property name="javax.persistence.jdbc.password" value="benchmarkdbpass"/>
+        </properties>
+    </persistence-unit>
+    
+    <persistence-unit name=".write" transaction-type="RESOURCE_LOCAL">
+        <properties>
+            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://tfb-database:3306/hello_world?useSSL=false&amp;rewriteBatchedStatements=true&amp;serverTimezone=UTC&amp;characterEncoding=utf8"/>
+            <property name="javax.persistence.jdbc.user" value="benchmarkdbuser"/>
+            <property name="javax.persistence.jdbc.password" value="benchmarkdbpass"/>
+        </properties>
+    </persistence-unit>
+   
+</persistence>

+ 3 - 3
frameworks/Java/redkale/config.toml

@@ -80,8 +80,8 @@ versus = "Redkale"
 [mongodb]
 urls.db = "/db"
 urls.fortune = "/fortunes"
-urls.query = "/queries?q="
-urls.update = "/updates?q="
+urls.query2 = "/queries?q="
+urls.update2 = "/updates?q="
 approach = "Realistic"
 classification = "Fullstack"
 database = "Mongodb"
@@ -90,4 +90,4 @@ os = "Linux"
 orm = "Raw"
 platform = "Redkale"
 webserver = "Redkale"
-versus = "Redkale"
+versus = "Redkale"

+ 6 - 5
frameworks/Java/redkale/pom-mongodb.xml

@@ -8,6 +8,7 @@
     <properties>
         <!-- the main class -->
         <main.class>org.redkale.boot.Application</main.class>
+		<redkale.version>2.7.0-SNAPSHOT</redkale.version>
         <stack.version>1.0.0</stack.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>11</maven.compiler.source>
@@ -18,19 +19,19 @@
         <dependency>
             <groupId>org.redkale</groupId>
             <artifactId>redkale</artifactId>
-            <version>2.5.0-SNAPSHOT</version>
+            <version>${redkale.version}</version>
         </dependency>
         
         <dependency>
             <groupId>org.redkalex</groupId>
             <artifactId>redkale-plugins</artifactId>
-            <version>2.5.0-SNAPSHOT</version>
+            <version>${redkale.version}</version>
         </dependency>
         
         <dependency>
             <groupId>org.mongodb</groupId>
             <artifactId>mongodb-driver-reactivestreams</artifactId>
-            <version>4.3.1</version>
+            <version>4.3.2</version>
         </dependency>
     </dependencies>
 
@@ -77,7 +78,7 @@
             <plugin>
                 <groupId>org.redkale.maven.plugins</groupId>
                 <artifactId>redkale-maven-plugin</artifactId>
-                <version>1.0.0-SNAPSHOT</version>                                                
+                <version>1.1.0-SNAPSHOT</version>                                                
                 <configuration>		
                     <nativeimageArgs>
                         <arg>--allow-incomplete-classpath</arg>
@@ -119,4 +120,4 @@
 
     </build>
 
-</project>
+</project>

+ 4 - 3
frameworks/Java/redkale/pom.xml

@@ -7,6 +7,7 @@
 
     <properties>
         <main.class>org.redkale.boot.Application</main.class>
+		<redkale.version>2.7.0-SNAPSHOT</redkale.version>
         <stack.version>1.0.0</stack.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>11</maven.compiler.source>
@@ -17,13 +18,13 @@
         <dependency>
             <groupId>org.redkale</groupId>
             <artifactId>redkale</artifactId>
-            <version>2.5.0-SNAPSHOT</version>
+            <version>${redkale.version}</version>
         </dependency>
         
         <dependency>
             <groupId>org.redkalex</groupId>
             <artifactId>redkale-plugins</artifactId>
-            <version>2.5.0-SNAPSHOT</version>
+            <version>${redkale.version}</version>
         </dependency>
         
     </dependencies>
@@ -71,7 +72,7 @@
             <plugin>
                 <groupId>org.redkale.maven.plugins</groupId>
                 <artifactId>redkale-maven-plugin</artifactId>
-                <version>1.0.0-SNAPSHOT</version>                                                
+                <version>1.1.0-SNAPSHOT</version>                                                
                 <configuration>		
                     <nativeimageArgs>
                         <arg>--allow-incomplete-classpath</arg>

+ 2 - 15
frameworks/Java/redkale/redkale-cache.dockerfile

@@ -1,23 +1,10 @@
-FROM openjdk:17-jdk-slim
-ARG DEBIAN_FRONTEND=noninteractive
-ARG MAVEN_VERSION=3.8.1
-
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /redkale
-RUN apt-get update -yqq
-RUN apt-get install -yqq wget
-
-RUN wget --no-verbose https://ftp.wayne.edu/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz
-RUN tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz
-ENV MAVEN_HOME /redkale/apache-maven-${MAVEN_VERSION}
-ENV PATH $MAVEN_HOME/bin:$PATH
-
 COPY src src
 COPY conf conf
 COPY pom.xml pom.xml
 RUN mvn package -q
 
-RUN cp /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar
-
 EXPOSE 8080
 
-CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-Dbenchmarks.cache=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "/redkale/target/redkale-benchmark-1.0.0.jar"]

+ 3 - 2
frameworks/Java/redkale/redkale-graalvm.dockerfile

@@ -5,11 +5,12 @@ COPY conf conf
 COPY pom.xml pom.xml
 RUN mvn package -q
 
-FROM ghcr.io/graalvm/graalvm-ce:21.2.0
+
+FROM ghcr.io/graalvm/graalvm-ce:21.3.0
 WORKDIR /redkale
 COPY conf conf
 COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar
 
 EXPOSE 8080
 
-CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=40000", "-Dbenchmarks.cache=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=40000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]

+ 3 - 16
frameworks/Java/redkale/redkale-mongodb.dockerfile

@@ -1,25 +1,12 @@
-FROM openjdk:17-jdk-slim
-ARG DEBIAN_FRONTEND=noninteractive
-ARG MAVEN_VERSION=3.8.1
-
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /redkale
-RUN apt-get update -yqq
-RUN apt-get install -yqq wget
-
-RUN wget --no-verbose https://ftp.wayne.edu/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz
-RUN tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz
-ENV MAVEN_HOME /redkale/apache-maven-${MAVEN_VERSION}
-ENV PATH $MAVEN_HOME/bin:$PATH
-
 COPY src src
 COPY conf conf
-COPY pom-mongodb.xml pom.xml
 RUN rm conf/persistence.xml
 RUN mv conf/persistence-mongodb.xml  conf/persistence.xml
+COPY pom-mongodb.xml pom.xml
 RUN mvn package -q
 
-RUN cp /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar
-
 EXPOSE 8080
 
-CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "/redkale/target/redkale-benchmark-1.0.0.jar"]

+ 12 - 0
frameworks/Java/redkale/redkale-mysql.dockerfile

@@ -0,0 +1,12 @@
+FROM maven:3.8.4-openjdk-17-slim as maven
+WORKDIR /redkale
+COPY src src
+COPY conf conf
+RUN rm conf/persistence.xml
+RUN mv conf/persistence-mysql.xml  conf/persistence.xml
+COPY pom.xml pom.xml
+RUN mvn package -q
+
+EXPOSE 8080
+
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "/redkale/target/redkale-benchmark-1.0.0.jar"]

+ 2 - 2
frameworks/Java/redkale/redkale-native.dockerfile

@@ -1,4 +1,4 @@
-FROM maven:3.6.3-openjdk-16-slim as maven
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /redkale
 COPY src src
 COPY conf conf
@@ -6,7 +6,7 @@ COPY pom.xml pom.xml
 RUN mvn package -q
 
 
-FROM ghcr.io/graalvm/graalvm-ce:21.2.0
+FROM ghcr.io/graalvm/graalvm-ce:21.3.0 
 RUN gu install native-image
 WORKDIR /redkale
 COPY conf conf

+ 2 - 15
frameworks/Java/redkale/redkale-postgres.dockerfile

@@ -1,23 +1,10 @@
-FROM openjdk:17-jdk-slim
-ARG DEBIAN_FRONTEND=noninteractive
-ARG MAVEN_VERSION=3.8.1
-
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /redkale
-RUN apt-get update -yqq
-RUN apt-get install -yqq wget
-
-RUN wget --no-verbose https://ftp.wayne.edu/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz
-RUN tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz
-ENV MAVEN_HOME /redkale/apache-maven-${MAVEN_VERSION}
-ENV PATH $MAVEN_HOME/bin:$PATH
-
 COPY src src
 COPY conf conf
 COPY pom.xml pom.xml
 RUN mvn package -q
 
-RUN cp /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar
-
 EXPOSE 8080
 
-CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "/redkale/target/redkale-benchmark-1.0.0.jar"]

+ 2 - 15
frameworks/Java/redkale/redkale.dockerfile

@@ -1,23 +1,10 @@
-FROM openjdk:17-jdk-slim
-ARG DEBIAN_FRONTEND=noninteractive
-ARG MAVEN_VERSION=3.8.1
-
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /redkale
-RUN apt-get update -yqq
-RUN apt-get install -yqq wget
-
-RUN wget --no-verbose https://ftp.wayne.edu/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz
-RUN tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz
-ENV MAVEN_HOME /redkale/apache-maven-${MAVEN_VERSION}
-ENV PATH $MAVEN_HOME/bin:$PATH
-
 COPY src src
 COPY conf conf
 COPY pom.xml pom.xml
 RUN mvn package -q
 
-RUN cp /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar
-
 EXPOSE 8080
 
-CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"]
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=80000", "-DAPP_HOME=./", "-jar", "/redkale/target/redkale-benchmark-1.0.0.jar"]

+ 0 - 5
frameworks/Java/redkale/setup.bat

@@ -1,5 +0,0 @@
-@ECHO OFF
-
-call mvn clean package
-
-call java -DAPP_HOME=./ -jar target/redkale-benchmark-1.0.0.jar 

+ 17 - 40
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java

@@ -5,14 +5,13 @@
  */
 package org.redkalex.benchmark;
 
-import java.util.Random;
 import java.util.concurrent.*;
+import java.util.stream.*;
 import javax.annotation.Resource;
 import org.redkale.net.http.*;
 import org.redkale.service.AbstractService;
 import org.redkale.source.*;
-import org.redkale.util.Utility;
-import org.redkalex.benchmark.CachedWorld.WorldEntityCache;
+import org.redkale.util.AnyValue;
 
 /**
  *
@@ -26,6 +25,11 @@ public class BenchmarkService extends AbstractService {
     @Resource
     private DataSource source;
 
+    @Override
+    public void init(AnyValue conf) {
+        CachedWorld.Cache.getInstance(source);
+    }
+
     @RestMapping(name = "plaintext")
     public byte[] getHelloBytes() {
         return helloBytes;
@@ -38,36 +42,22 @@ public class BenchmarkService extends AbstractService {
 
     @RestMapping(name = "db")
     public CompletableFuture<World> findWorldAsync() {
-        return source.findAsync(World.class, randomId(ThreadLocalRandom.current()));
+        return source.findAsync(World.class, ThreadLocalRandom.current().nextInt(10000) + 1);
     }
 
     @RestMapping(name = "queries")
     public CompletableFuture<World[]> queryWorldAsync(int q) {
-        final int size = Math.min(500, Math.max(1, q));
-        final Random random = ThreadLocalRandom.current();
-        final CompletableFuture<World>[] futures = new CompletableFuture[size];
-        for (int i = 0; i < size; i++) {
-            futures[i] = source.findAsync(World.class, randomId(random));
-        }
-        return Utility.allOfFutures(futures, c -> new World[c]);
+        int size = Math.min(500, Math.max(1, q));
+        IntStream ids = ThreadLocalRandom.current().ints(size, 1, 10001);
+        return source.findsAsync(World.class, ids.boxed());
     }
 
     @RestMapping(name = "updates")
     public CompletableFuture<World[]> updateWorldAsync(int q) {
-        final int size = Math.min(500, Math.max(1, q));
-        final Random random = ThreadLocalRandom.current();
-        final CompletableFuture<World>[] futures = new CompletableFuture[size];
-        for (int i = 0; i < size; i++) {
-            futures[i] = source.findAsync(World.class, randomId(random));
-        }
-        return CompletableFuture.allOf(futures).thenCompose(v -> {
-            final Random r = ThreadLocalRandom.current();
-            final World[] worlds = new World[size];
-            for (int i = 0; i < size; i++) {
-                worlds[i] = futures[i].join().randomNumber(randomId(r));
-            }
-            return source.updateAsync(World.sort(worlds)).thenApply(u -> worlds);
-        });
+        int size = Math.min(500, Math.max(1, q));
+        IntStream ids = ThreadLocalRandom.current().ints(size, 1, 10001);
+        int[] newNumbers = ThreadLocalRandom.current().ints(size, 1, 10001).toArray();
+        return source.findsAsync(World.class, ids.boxed()).thenCompose(words -> source.updateAsync(World.setNewNumbers(words, newNumbers)).thenApply(v -> words));
     }
 
     @RestMapping(name = "fortunes")
@@ -78,22 +68,9 @@ public class BenchmarkService extends AbstractService {
         });
     }
 
-    private WorldEntityCache cache;
-
     @RestMapping(name = "cached-worlds")
     public CachedWorld[] cachedWorlds(int q) {
-        if (cache == null) {
-            synchronized (this) {
-                if (cache == null) cache = new WorldEntityCache(source);
-            }
-        }
-        final int size = Math.min(500, Math.max(1, q));
-        return cache.random(ThreadLocalRandom.current(), size);
+        int size = Math.min(500, Math.max(1, q));
+        return CachedWorld.Cache.getInstance(source).random(ThreadLocalRandom.current(), size);
     }
-
-    protected int randomId(Random rand) {
-        long s = rand.nextLong();
-        return (int) ((s < 0 ? -s : s) % 10000) + 1;
-    }
-
 }

+ 23 - 19
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java

@@ -1,11 +1,8 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
 package org.redkalex.benchmark;
 
 import java.util.*;
+import java.util.function.IntFunction;
+import java.util.stream.IntStream;
 import javax.persistence.*;
 import org.redkale.convert.json.JsonConvert;
 import org.redkale.source.*;
@@ -14,7 +11,6 @@ import org.redkale.source.*;
  *
  * @author zhangjx
  */
-//@Cacheable(direct = true)
 @Entity
 @Table(name = "World")
 public final class CachedWorld implements Comparable<CachedWorld> {
@@ -55,27 +51,35 @@ public final class CachedWorld implements Comparable<CachedWorld> {
         return JsonConvert.root().convertTo(this);
     }
 
-    public static class WorldEntityCache {
+    public static class Cache {
+
+        private static Cache instance;
+
+        static Cache getInstance(DataSource source) {
+            if (instance == null) {
+                synchronized (Cache.class) {
+                    if (instance == null) {
+                        instance = new Cache(source);
+                    }
+                }
+            }
+            return instance;
+        }
 
         private CachedWorld[] array;
 
-        public WorldEntityCache(DataSource source) {
+        private IntFunction<CachedWorld> mapFunc = c -> array[c];
+
+        private IntFunction<CachedWorld[]> arrayFunc = c -> new CachedWorld[c];
+
+        public Cache(DataSource source) {
             List<CachedWorld> list = source.queryList(CachedWorld.class);
             this.array = list.toArray(new CachedWorld[list.size()]);
         }
 
-        public CachedWorld findAt(int index) {
-            return (CachedWorld) array[index];
-        }
-
         public CachedWorld[] random(Random random, int size) {
-            Random rand = random;
-            final CachedWorld[] worlds = new CachedWorld[size];
-            for (int i = 0; i < worlds.length; i++) {
-                long index = Math.abs(rand.nextLong()) % 10000;
-                worlds[i] = array[(int) index];
-            }
-            return worlds;
+            IntStream ids = random.ints(size, 0, 10000);
+            return ids.mapToObj(mapFunc).toArray(arrayFunc);
         }
     }
 }

+ 22 - 6
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java

@@ -5,10 +5,11 @@
  */
 package org.redkalex.benchmark;
 
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import org.redkale.convert.Convert;
 import org.redkale.net.http.*;
-import org.redkale.util.AnyValue;
+import org.redkale.util.*;
 
 /**
  *
@@ -16,19 +17,34 @@ import org.redkale.util.AnyValue;
  */
 public class FortuneRender implements org.redkale.net.http.HttpRender {
 
+    private static final String contentType = "text/html; charset=utf-8";
+
+    private static final byte[] text1 = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>".getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] text2 = "<tr><td>".getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] text3 = "</td><td>".getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] text4 = "</td></tr>".getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] text5 = "</table></body></html>".getBytes(StandardCharsets.UTF_8);
+
+    private final ThreadLocal<ByteArray> localByteArray = ThreadLocal.withInitial(() -> new ByteArray(1200));
+
     @Override
     public void init(HttpContext context, AnyValue config) {
     }
 
     @Override
     public void renderTo(HttpRequest request, HttpResponse response, Convert convert, HttpScope scope) {
-        StringBuilder sb = new StringBuilder(1200);
-        sb.append("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>");
+        ByteArray array = localByteArray.get().clear();
+        array.put(text1);
         for (Fortune item : (List<Fortune>) scope.find("fortunes")) {
-            sb.append("<tr><td>").append(item.getId()).append("</td><td>").append(escape(item.getMessage())).append("</td></tr>");
+            array.put(text2).put(String.valueOf(item.getId()).getBytes(StandardCharsets.UTF_8))
+                .put(text3).put(escape(item.getMessage()).toString().getBytes(StandardCharsets.UTF_8)).put(text4);
         }
-        sb.append("</table></body></html>");
-        response.setContentType("text/html; charset=utf-8").finish(sb.toString());
+        array.put(text5);
+        response.finish(contentType, array);
     }
 
     private static CharSequence escape(CharSequence value) {

+ 4 - 1
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/World.java

@@ -26,7 +26,10 @@ public final class World implements Comparable<World> {
         return this;
     }
 
-    public static World[] sort(World[] worlds) {
+    public static World[] setNewNumbers(World[] worlds, int[] newNumbers) {
+        for (int i = 0; i < worlds.length; i++) {
+            worlds[i].randomNumber = newNumbers[i];
+        }
         Arrays.sort(worlds);
         return worlds;
     }

+ 0 - 23
frameworks/Kotlin/hexagon/benchmark_config.json

@@ -25,29 +25,6 @@
                 "notes": "http://hexagonkt.com",
                 "versus": "servlet"
             },
-            "blackbird": {
-                "json_url": "/json",
-                "db_url": "/postgresql/db",
-                "query_url": "/postgresql/query?queries=",
-                "fortune_url": "/postgresql/pebble/fortunes",
-                "update_url": "/postgresql/update?queries=",
-                "cached_query_url": "/postgresql/cached?count=",
-                "plaintext_url": "/plaintext",
-                "port": 9090,
-                "approach": "Realistic",
-                "classification": "Micro",
-                "database": "postgres",
-                "framework": "Hexagon",
-                "language": "Kotlin",
-                "orm": "Raw",
-                "platform": "Servlet",
-                "webserver": "None",
-                "os": "Linux",
-                "database_os": "Linux",
-                "display_name": "Hexagon Jetty PostgreSQL",
-                "notes": "http://hexagonkt.com",
-                "versus": "servlet"
-            },
             "resin": {
                 "json_url": "/json",
                 "db_url": "/postgresql/db",

+ 5 - 5
frameworks/Kotlin/hexagon/build.gradle

@@ -1,16 +1,16 @@
 
 plugins {
-    id "org.jetbrains.kotlin.jvm" version "1.5.31"
+    id "org.jetbrains.kotlin.jvm" version "1.6.10"
 }
 
 ext {
-    gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.4.7/gradle"
+    gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/1.5.1/gradle"
 
-    hexagonVersion = "1.4.7"
+    hexagonVersion = "1.5.1"
     hikariVersion = "5.0.0"
     jettyVersion = "10.0.7"
-    postgresqlVersion = "42.2.24"
-    cache2kVersion = "2.2.1.Final"
+    postgresqlVersion = "42.3.1"
+    cache2kVersion = "2.4.1.Final"
     jacksonBlackbirdVersion = "2.13.0"
 }
 

+ 0 - 18
frameworks/Kotlin/hexagon/config.toml

@@ -19,24 +19,6 @@ platform = "Servlet"
 webserver = "None"
 versus = "servlet"
 
-[blackbird]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/postgresql/db"
-urls.query = "/postgresql/query?queries="
-urls.update = "/postgresql/update?queries="
-urls.fortune = "/postgresql/pebble/fortunes"
-urls.cached_query = "/postgresql/cached?count="
-approach = "Realistic"
-classification = "Micro"
-database = "postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "Servlet"
-webserver = "None"
-versus = "servlet"
-
 [resin]
 urls.plaintext = "/plaintext"
 urls.json = "/json"

+ 0 - 26
frameworks/Kotlin/hexagon/hexagon-blackbird.dockerfile

@@ -1,26 +0,0 @@
-#
-# BUILD
-#
-FROM gradle:7.2-jdk11 AS gradle_build
-USER root
-WORKDIR /hexagon
-
-COPY src src
-COPY build.gradle build.gradle
-RUN gradle --quiet
-
-#
-# RUNTIME
-#
-FROM adoptopenjdk:11-jre-hotspot-bionic
-ENV DBSTORE postgresql
-ENV POSTGRESQL_DB_HOST tfb-database
-ENV WEBENGINE jetty
-ENV PROJECT hexagon
-ENV ENABLE_BLACKBIRD true
-
-COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT
-
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT

+ 2 - 1
frameworks/Kotlin/hexagon/hexagon.dockerfile

@@ -1,7 +1,7 @@
 #
 # BUILD
 #
-FROM gradle:7.2-jdk11 AS gradle_build
+FROM gradle:7.3.3-jdk11 AS gradle_build
 USER root
 WORKDIR /hexagon
 
@@ -17,6 +17,7 @@ ENV DBSTORE postgresql
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV WEBENGINE jetty
 ENV PROJECT hexagon
+ENV ENABLE_BLACKBIRD true
 
 COPY --from=gradle_build /hexagon/build/install/$PROJECT /opt/$PROJECT
 

+ 2 - 1
frameworks/Kotlin/hexagon/src/main/kotlin/Benchmark.kt

@@ -1,12 +1,13 @@
 package com.hexagonkt
 
 import com.fasterxml.jackson.module.blackbird.BlackbirdModule
-import com.hexagonkt.helpers.Jvm
+import com.hexagonkt.core.helpers.Jvm
 import com.hexagonkt.http.server.Server
 import com.hexagonkt.http.server.ServerPort
 import com.hexagonkt.http.server.ServerSettings
 import com.hexagonkt.http.server.jetty.JettyServletAdapter
 import com.hexagonkt.serialization.*
+import com.hexagonkt.serialization.json.*
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.store.BenchmarkStore
 import com.hexagonkt.templates.TemplatePort

+ 3 - 3
frameworks/Kotlin/hexagon/src/main/kotlin/Controller.kt

@@ -1,9 +1,9 @@
 package com.hexagonkt
 
-import com.hexagonkt.helpers.require
+import com.hexagonkt.core.helpers.require
 import com.hexagonkt.http.server.Call
 import com.hexagonkt.http.server.Router
-import com.hexagonkt.serialization.Json
+import com.hexagonkt.serialization.json.Json
 import com.hexagonkt.serialization.toFieldsMap
 import com.hexagonkt.store.BenchmarkStore
 import com.hexagonkt.templates.TemplatePort
@@ -91,4 +91,4 @@ class Controller(private val settings: Settings) {
         catch (e: Exception) {
             null
         }
-}
+}

+ 2 - 2
frameworks/Kotlin/hexagon/src/main/kotlin/Settings.kt

@@ -1,6 +1,6 @@
 package com.hexagonkt
 
-import com.hexagonkt.helpers.Jvm.systemSetting
+import com.hexagonkt.core.helpers.Jvm.systemSetting
 
 data class Settings(
     val bindPort: Int = systemSetting("bindPort") ?: 9090,
@@ -25,4 +25,4 @@ data class Settings(
     val textMessage: String = "Hello, World!",
     val queriesParam: String = "queries",
     val cachedQueriesParam: String = "count",
-)
+)

+ 3 - 3
frameworks/Kotlin/hexagon/src/main/kotlin/WebListenerServer.kt

@@ -2,8 +2,8 @@ package com.hexagonkt
 
 import com.fasterxml.jackson.module.blackbird.BlackbirdModule
 import com.hexagonkt.http.server.servlet.ServletServer
-import com.hexagonkt.serialization.JacksonMapper
-import com.hexagonkt.serialization.Json
+import com.hexagonkt.serialization.json.JacksonMapper
+import com.hexagonkt.serialization.json.Json
 import com.hexagonkt.serialization.SerializationManager
 import javax.servlet.annotation.WebListener
 
@@ -14,4 +14,4 @@ import javax.servlet.annotation.WebListener
         SerializationManager.mapper = JacksonMapper
         SerializationManager.formats = linkedSetOf(Json)
     }
-}
+}

+ 2 - 2
frameworks/Kotlin/hexagon/src/main/kotlin/store/BenchmarkSqlStore.kt

@@ -4,7 +4,7 @@ import com.hexagonkt.CachedWorld
 import com.hexagonkt.Fortune
 import com.hexagonkt.Settings
 import com.hexagonkt.World
-import com.hexagonkt.helpers.Jvm
+import com.hexagonkt.core.helpers.Jvm
 import com.zaxxer.hikari.HikariConfig
 import com.zaxxer.hikari.HikariDataSource
 import org.cache2k.Cache
@@ -100,4 +100,4 @@ internal class BenchmarkSqlStore(engine: String, private val settings: Settings
         rs.next()
         return World(rs.getInt(1), rs.getInt(2))
     }
-}
+}

+ 1 - 1
frameworks/Nim/httpbeast/techempower.nimble

@@ -11,4 +11,4 @@ skipExt = @["nim"]
 # Dependencies
 
 # We lock dependencies here on purpose.
-requires "httpbeast#v0.2.2"
+requires "httpbeast#v0.4.0"

+ 1 - 1
frameworks/Nim/jester/techempower.nimble

@@ -13,5 +13,5 @@ skipExt = @["nim"]
 requires "nim >= 1.0.0"
 
 # We lock dependencies here on purpose.
-requires "httpbeast#v0.2.2"
+requires "httpbeast#v0.4.0"
 requires "jester 0.5.0"

+ 102 - 0
frameworks/PHP/openswoole/README.md

@@ -0,0 +1,102 @@
+<h1>
+    <img width="200" height="120" align="center" alt="Open Swoole Logo" src="https://www.swoole.co.uk/images/swoole-logo.svg" />
+</h1>
+
+[![lib-openswoole](https://github.com/openswoole/swoole-src/workflows/lib-openswoole/badge.svg)](https://github.com/openswoole/swoole-src/actions?query=workflow%3Alib-openswoole)
+[![ext-openswoole](https://github.com/openswoole/swoole-src/workflows/ext-openswoole/badge.svg)](https://github.com/openswoole/swoole-src/actions?query=workflow%3Aext-openswoole)
+[![test-linux](https://github.com/openswoole/swoole-src/workflows/test-linux/badge.svg)](https://github.com/openswoole/swoole-src/actions?query=workflow%3Atest-linux)
+[![Coverity Scan Build Status](https://scan.coverity.com/projects/23970/badge.svg)](https://scan.coverity.com/projects/open-swoole-src)
+[![codecov](https://codecov.io/gh/openswoole/swoole-src/branch/master/graph/badge.svg)](https://codecov.io/gh/openswoole/swoole-src)
+
+**Open Swoole (since 2017) is a programmatic server for PHP with async IO, coroutines and fibers: secure, reliable, high performance**
+
+## Documentation & Community
+
++ __Documentation__: <https://www.swoole.co.uk/docs>
++ __Twitter__: <https://twitter.com/openswoole>
++ __Join Slack Group__: <https://goo.gl/forms/wooTTDmhbu30x4qC3>
++ __Join Discord Channel__: <https://discord.gg/5QC57RNPpw>
++ __IDE Helper & API__: <https://github.com/openswoole/ide-helper>
+
+## Installation
+
+> As with any open source project, Open Swoole always provides the most reliable stability and the most powerful features in **the latest released version**. Please ensure as much as possible that you are using the latest version.
+
+### Compiling requirements
+
++ Linux, OS X or Cygwin, WSL
++ PHP 7.2.0 or later (The higher the version, the better the performance.)
++ GCC 4.8 or later
+
+### 1. Install with PECL (beginners)
+
+```shell
+pecl install openswoole
+```
+
+### 2. Install from source (recommended)
+
+Please download the source packages from [Releases](https://github.com/openswoole/swoole-src/releases) or:
+
+```shell
+git clone https://github.com/openswoole/swoole-src.git && \
+cd swoole-src
+git checkout v4.8.0
+```
+
+Compile and install at the source folder:
+
+```shell
+phpize && \
+./configure && \
+make && make install
+```
+
+#### Enable extension in PHP
+
+After compiling and installing the openswoole extension, you have to add a new line `extension=openswoole.so` to `php.ini` to enable Open Swoole. It is recommended to be added after all the other extensions because openswoole may depend on extensions: sockets, mysqlnd, curl etc.
+
+#### Extra compile configurations
+
+> for example: `./configure --enable-openssl --enable-sockets`
+
++ `--enable-openssl` or `--with-openssl-dir=DIR`
++ `--enable-sockets`
++ `--enable-http2`
++ `--enable-mysqlnd` (need mysqlnd, it just for supporting `$mysql->escape` method)
++ `--enable-swoole-json`
++ `--enable-swoole-curl`
++ `--with-postgres[=DIR]`
+
+### Upgrade
+
+>  If you upgrade from source, don't forget to `make clean` before you upgrade your swoole
+
+1. `pecl upgrade openswoole`
+2. `cd swoole-src && git pull && make clean && make && sudo make install`
+3. if you have changed PHP version, please re-run `phpize clean && phpize` then try to compile
+
+## Call for Contributors
+
+If you like to involve the maintenance of this repo, it is better to get started by submitting PR, you will be invited to the dev group once there are significant contributions. Or join Slack group firstly, the team will provide mentoring and internal support to help you get started.
+
+* [Report issues and feedback](https://github.com/openswoole/swoole-src/issues)
+* Submit fixes, features via Pull Request
+
+This project exists thanks to all the historical [[Contributors](https://github.com/openswoole/swoole-src/graphs/contributors)].
+
+## Security issues
+
+Security issues should be reported privately, via email, to the Open Swoole develop team [[email protected]](mailto:[email protected]). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message.
+
+## Frameworks & Components
+
+> PR are welcome if your framework is using openswoole
+ 
+ - [**Laravel Octane**](https://laravel.com/docs/8.x/octane) Laravel Octane supercharges your application's performance by serving your application using high-powered application servers.
+ - [**PHP Runtime**](https://github.com/php-runtime) make it easy to run any kind of PHP Application (Symfony, Laravel, PSR7, Native) with all kinds of Runtimes like OpenSwoole, Bref, Google Cloud Functions, Roadrunner and React PHP with minimal configuration.
+ - [**Mezzio Swoole**](https://docs.mezzio.dev/mezzio-swoole/) allows you to run Mezzio and [PSR-15](https://www.php-fig.org/psr/psr-15/) applications on Open Swoole.
+
+## License
+
+Apache License Version 2.0 see http://www.apache.org/licenses/LICENSE-2.0.html

+ 70 - 0
frameworks/PHP/openswoole/benchmark_config.json

@@ -0,0 +1,70 @@
+{
+  "framework": "openswoole",
+  "tests": [{
+    "default": {
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "db_url": "/db",
+      "query_url": "/db?queries=",
+      "fortune_url": "/fortunes",
+      "update_url": "/updates?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "openswoole",
+      "language": "PHP",
+      "flavor": "PHP8.1",
+      "orm": "Raw",
+      "platform": "openswoole",
+      "webserver": "none",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Open Swoole",
+      "notes": "",
+      "versus": "php"
+    },
+    "postgres": {
+      "db_url": "/db",
+      "query_url": "/db?queries=",
+      "fortune_url": "/fortunes",
+      "update_url": "/updates?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "openswoole",
+      "language": "PHP",
+      "flavor": "PHP8",
+      "orm": "Raw",
+      "platform": "openswoole",
+      "webserver": "none",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Open Swoole Postgres",
+      "notes": "",
+      "versus": "php"
+    },
+    "no-async": {
+      "db_url": "/db",
+      "query_url": "/query?q=",
+      "fortune_url": "/fortunes",
+      "update_url": "/updates?q=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "openswoole",
+      "language": "PHP",
+      "flavor": "PHP8.1",
+      "orm": "Raw",
+      "platform": "openswoole",
+      "webserver": "none",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Open Swoole no-async",
+      "notes": "Without async db pool connection",
+      "versus": "php"
+    }
+  }]
+}

+ 49 - 0
frameworks/PHP/openswoole/config.toml

@@ -0,0 +1,49 @@
+[framework]
+name = "openswoole"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/db?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Platform"
+database = "MySQL"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "openswoole"
+webserver = "none"
+versus = "php"
+
+[postgres]
+urls.db = "/db"
+urls.query = "/db?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Platform"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "openswoole"
+webserver = "none"
+versus = "php"
+
+[no-async]
+urls.db = "/db"
+urls.query = "/query?q="
+urls.update = "/updates?q="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Platform"
+database = "MySQL"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "openswoole"
+webserver = "none"
+versus = "php"

+ 116 - 0
frameworks/PHP/openswoole/db-no-async.php

@@ -0,0 +1,116 @@
+<?php
+class Db
+{
+    public static PDOStatement $db;
+    public static PDOStatement $fortune;
+    public static PDOStatement $random;
+    public static PDOStatement $update;
+
+    public static function init()
+    {
+        $pdo = new PDO(
+            "mysql:host=tfb-database;dbname=hello_world",
+            "benchmarkdbuser",
+            "benchmarkdbpass",
+            [
+                PDO::ATTR_DEFAULT_FETCH_MODE  => PDO::FETCH_ASSOC,
+                PDO::ATTR_ERRMODE             => PDO::ERRMODE_EXCEPTION,
+                PDO::ATTR_EMULATE_PREPARES    => false
+            ]
+        );
+
+        self::$db        = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
+        self::$fortune   = $pdo->prepare('SELECT id,message FROM Fortune');
+        self::$random    = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
+        self::$update    = $pdo->prepare('UPDATE World SET randomNumber = ? WHERE id = ?');
+    }
+}
+
+/**
+ * The DB test
+ *
+ * @return string
+ */
+function db(): string
+{
+    Db::$db->execute([mt_rand(1, 10000)]);
+    return json_encode(Db::$db->fetch(), JSON_NUMERIC_CHECK);
+}
+
+/**
+ * The Queries test
+ *
+ * @param int $queries
+ *
+ * @return string
+ */
+function query(int $queries = 1): string
+{
+    // Read number of queries to run from URL parameter
+    $query_count = 1;
+    if ($queries > 1) {
+        $query_count = $queries > 500 ? 500 : $queries;
+    }
+
+    // Create an array with the response string.
+    $arr = [];
+
+    // For each query, store the result set values in the response array
+    while ($query_count--) {
+        DB::$db->execute([mt_rand(1, 10000)]);
+        $arr[] = Db::$db->fetch();
+    }
+
+    return json_encode($arr, JSON_NUMERIC_CHECK);
+}
+
+/**
+ * The Fortunes test
+ *
+ * @return string
+ */
+function fortunes(): string
+{
+    $fortune = [];
+    Db::$fortune->execute();
+    $fortune = Db::$fortune->fetchAll(PDO::FETCH_KEY_PAIR);
+
+    $fortune[0] = 'Additional fortune added at request time.';
+    asort($fortune);
+
+    $html = '';
+    foreach ($fortune as $id => $message) {
+        $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
+        $html .= "<tr><td>$id</td><td>$message</td></tr>";
+    }
+
+    return "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>$html</table></body></html>";
+}
+
+/**
+ * The Updates test
+ *
+ * @param int $queries
+ *
+ * @return string
+ */
+function updates(int $queries): string
+{
+    $query_count = 1;
+    if ($queries > 1) {
+        $query_count = $queries > 500 ? 500 : $queries;
+    }
+
+    while ($query_count--) {
+        $id = mt_rand(1, 10000);
+        Db::$random->execute([$id]);
+
+        $world = ["id" => $id, "randomNumber" => Db::$random->fetchColumn()];
+        $world['randomNumber'] = mt_rand(1, 10000);
+        Db::$update->execute([$world['randomNumber'], $world['id']]);
+
+        $arr[] = $world;
+    }
+
+    return json_encode($arr, JSON_NUMERIC_CHECK);
+}

+ 15 - 0
frameworks/PHP/openswoole/openswoole-no-async.dockerfile

@@ -0,0 +1,15 @@
+FROM php:8.1-rc-cli
+
+RUN pecl install openswoole > /dev/null && \
+    docker-php-ext-enable openswoole
+
+RUN docker-php-ext-install opcache pdo_mysql > /dev/null
+
+ADD ./ /openswoole
+WORKDIR /openswoole
+
+COPY php.ini /usr/local/etc/php/
+
+EXPOSE 8080
+
+CMD php swoole-server-noasync.php

+ 22 - 0
frameworks/PHP/openswoole/openswoole-postgres.dockerfile

@@ -0,0 +1,22 @@
+FROM php:8.1-rc-cli
+
+RUN docker-php-ext-install opcache  > /dev/null
+
+ENV SWOOLE_VERSION 4.8.0
+
+RUN     apt-get update && apt-get install -y libpq-dev \
+        && cd /tmp && curl -sSL "https://github.com/openswoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
+        && cd swoole-src-${SWOOLE_VERSION} \
+        && phpize && ./configure --with-postgres > /dev/null && make > /dev/null && make install > /dev/null \
+        && docker-php-ext-enable openswoole
+ 
+WORKDIR /openswoole
+
+COPY swoole-server.php swoole-server.php
+RUN sed -i "s|_postgres||g" swoole-server.php
+
+COPY php.ini /usr/local/etc/php/
+
+EXPOSE 8080
+
+CMD php swoole-server.php

+ 18 - 0
frameworks/PHP/openswoole/openswoole.dockerfile

@@ -0,0 +1,18 @@
+FROM php:8.1-rc-cli
+
+RUN pecl install openswoole > /dev/null && \
+    docker-php-ext-enable openswoole
+
+RUN docker-php-ext-install opcache  > /dev/null
+
+WORKDIR /openswoole
+
+COPY swoole-server.php swoole-server.php
+RUN sed -i "s|DatabasePool('postgres|DatabasePool('mysql|g" swoole-server.php
+RUN sed -i "s|_mysql||g" swoole-server.php
+
+COPY php.ini /usr/local/etc/php/
+
+EXPOSE 8080
+
+CMD php swoole-server.php

+ 6 - 0
frameworks/PHP/openswoole/php.ini

@@ -0,0 +1,6 @@
+opcache.enable_cli=1
+opcache.validate_timestamps=0
+memory_limit = 512M
+
+opcache.jit_buffer_size=128M
+opcache.jit=tracing

+ 69 - 0
frameworks/PHP/openswoole/swoole-server-noasync.php

@@ -0,0 +1,69 @@
+<?php
+require_once __DIR__.'/db-no-async.php';
+
+use Swoole\Http\Request;
+use Swoole\Http\Response;
+
+$server = new swoole_http_server('0.0.0.0', 8080, SWOOLE_BASE);
+$server->set([
+    'worker_num' => swoole_cpu_num() * 4,
+    'log_file' => '/dev/null',
+    'log_level' => 5,
+    'open_tcp_nodelay' => true,
+]);
+
+/**
+ * On start of the PHP worker. One worker per server process is started.
+ */
+$server->on('workerStart', function () {
+    Db::init();
+});
+
+/**
+ * On every request to the (web)server, execute the following code
+ */
+$server->on('request', static function (Request $req, Response $res) {
+    try {
+        switch ($req->server['request_uri']) {
+            case '/json':
+                $res->header('Content-Type', 'application/json');
+                $res->end(json_encode(['message' => 'Hello, World!']));
+                break;
+
+            case '/plaintext':
+                $res->header('Content-Type', 'text/plain; charset=utf-8');
+                $res->end('Hello, World!');
+                break;
+
+            case '/db':
+                $res->header('Content-Type', 'application/json');
+                $res->end(db());
+                break;
+            
+            case '/query':
+                $res->header('Content-Type', 'application/json');
+                $res->end(query((int) $req->get['q'] ?? 1));
+                break;
+
+            case '/fortunes':
+                $res->header('Content-Type', 'text/html; charset=utf-8');
+                $res->end(fortunes());
+                break;
+
+            case '/updates':
+                $res->header('Content-Type', 'application/json');
+                $res->end(updates((int) $req->get['q'] ?? 1));
+                break;
+
+            default:
+                $res->status(404);
+                $res->end('Not Found.');
+        }
+
+    } catch (\Throwable $e) {
+        $res->status(500);
+        $res->end('code ' . $e->getCode(). 'msg: '. $e->getMessage());
+    }
+});
+
+$server->start();

Some files were not shown because too many files changed in this diff