Browse Source

[F#/Oxpecker] Several improvements (#9170)

* [F#/Oxpecker] Change fortunes serialization to chunked

* [F#/Oxpecker] Database query improvements

* [F#/Oxpecker] Disabled config file changes
Vladimir Shchur 1 year ago
parent
commit
8710bc8068

+ 1 - 0
frameworks/FSharp/oxpecker/oxpecker.dockerfile

@@ -6,6 +6,7 @@ RUN dotnet publish -c Release -o out
 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
 
 
 ENV DOTNET_ReadyToRun 0
 ENV DOTNET_ReadyToRun 0
+ENV ASPNETCORE_hostBuilder__reloadConfigOnChange false
 
 
 ENV URLS http://+:8080
 ENV URLS http://+:8080
 
 

+ 1 - 1
frameworks/FSharp/oxpecker/src/App/App.fsproj

@@ -13,7 +13,7 @@
 
 
   <ItemGroup>
   <ItemGroup>
     <PackageReference Update="FSharp.Core" Version="8.0.300" />
     <PackageReference Update="FSharp.Core" Version="8.0.300" />
-    <PackageReference Include="Oxpecker" Version="0.10.1" />
+    <PackageReference Include="Oxpecker" Version="0.13.0" />
     <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Npgsql" Version="8.0.3" />
   </ItemGroup>
   </ItemGroup>
 </Project>
 </Project>

+ 16 - 7
frameworks/FSharp/oxpecker/src/App/Db.fs

@@ -21,19 +21,19 @@ module Db =
             return result
             return result
         }
         }
 
 
-    let private createReadCommand (connection: DbConnection) =
+    let private createReadCommand (connection: NpgsqlConnection) =
         let cmd = connection.CreateCommand(
         let cmd = connection.CreateCommand(
             CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id"
             CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id"
         )
         )
-        let id = cmd.CreateParameter(
+        let id = NpgsqlParameter<int>(
             ParameterName = "@Id",
             ParameterName = "@Id",
             DbType = DbType.Int32,
             DbType = DbType.Int32,
-            Value = Random.Shared.Next(1, 10001)
+            TypedValue = Random.Shared.Next(1, 10001)
         )
         )
         cmd.Parameters.Add(id) |> ignore
         cmd.Parameters.Add(id) |> ignore
         cmd
         cmd
 
 
-    let private readSingleRow (cmd: DbCommand) =
+    let private readSingleRow (cmd: NpgsqlCommand) =
         task {
         task {
             use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)
             use! rdr = cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)
             let! _ = rdr.ReadAsync()
             let! _ = rdr.ReadAsync()
@@ -83,12 +83,21 @@ module Db =
         | q ->
         | q ->
             q
             q
 
 
-    let private generateParameters (results: World[]) (command: DbCommand) =
+    // fill cache
+    let _ = [| 0..maxBatch |] |> Array.map batchUpdateString
+
+    let private paramNames =
+        seq { 0..maxBatch*2 }
+        |> Seq.map (fun i -> struct($"@Rn_{i}", $"@Id_{i}"))
+        |> Seq.toArray
+
+    let private generateParameters (results: World[]) (command: NpgsqlCommand) =
         for i in 0..results.Length-1 do
         for i in 0..results.Length-1 do
             let randomNumber = Random.Shared.Next(1, 10001)
             let randomNumber = Random.Shared.Next(1, 10001)
-            let random = command.CreateParameter(ParameterName = $"@Rn_{i}", DbType = DbType.Int32, Value = randomNumber)
+            let struct(rnParamName, idParamName) = paramNames[i]
+            let random = NpgsqlParameter<int>(ParameterName = rnParamName, DbType = DbType.Int32, TypedValue = randomNumber)
             command.Parameters.Add(random) |> ignore
             command.Parameters.Add(random) |> ignore
-            let id = command.CreateParameter(ParameterName = $"@Id_{i}", DbType = DbType.Int32, Value = results[i].id)
+            let id = NpgsqlParameter<int>(ParameterName = idParamName, DbType = DbType.Int32, TypedValue = results[i].id)
             command.Parameters.Add(id) |> ignore
             command.Parameters.Add(id) |> ignore
             results[i] <- { results[i] with randomnumber = randomNumber }
             results[i] <- { results[i] with randomnumber = randomNumber }
 
 

+ 1 - 1
frameworks/FSharp/oxpecker/src/App/Program.fs

@@ -49,7 +49,7 @@ module HttpHandlers =
     let rec private renderFortunes (ctx: HttpContext) (data: ResizeArray<Fortune>) =
     let rec private renderFortunes (ctx: HttpContext) (data: ResizeArray<Fortune>) =
         data.Add extra
         data.Add extra
         data.Sort FortuneComparer
         data.Sort FortuneComparer
-        data |> HtmlViews.fortunes |> ctx.WriteHtmlView
+        data |> HtmlViews.fortunes |> ctx.WriteHtmlViewChunked
 
 
     let fortunes : EndpointHandler =
     let fortunes : EndpointHandler =
         fun ctx ->
         fun ctx ->