diff --git a/src/Marten.AspNetCore/QueryableExtensions.cs b/src/Marten.AspNetCore/QueryableExtensions.cs index 4c4925235c..de482e29ad 100644 --- a/src/Marten.AspNetCore/QueryableExtensions.cs +++ b/src/Marten.AspNetCore/QueryableExtensions.cs @@ -25,7 +25,7 @@ public static async Task WriteSingle( int onFoundStatus = 200 ) { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await queryable.StreamJsonFirstOrDefault(stream, context.RequestAborted).ConfigureAwait(false); if (found) @@ -82,7 +82,7 @@ public static async Task WriteById( int onFoundStatus = 200 ) where T : class { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await json.StreamById(id, stream, context.RequestAborted).ConfigureAwait(false); if (found) { @@ -117,7 +117,7 @@ public static async Task WriteById( int onFoundStatus = 200 ) where T : class { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await json.StreamById(id, stream, context.RequestAborted).ConfigureAwait(false); if (found) { @@ -152,7 +152,7 @@ public static async Task WriteById( int onFoundStatus = 200 ) where T : class { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await json.StreamById(id, stream, context.RequestAborted).ConfigureAwait(false); if (found) { @@ -187,7 +187,7 @@ public static async Task WriteById( int onFoundStatus = 200 ) where T : class { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await json.StreamById(id, stream, context.RequestAborted).ConfigureAwait(false); if (found) { @@ -222,7 +222,7 @@ public static async Task WriteById( int onFoundStatus = 200 ) where T : class { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await json.StreamById(id, stream, context.RequestAborted).ConfigureAwait(false); if (found) { @@ -259,7 +259,7 @@ public static async Task WriteOne( int onFoundStatus = 200 ) where TDoc : notnull { - var stream = new MemoryStream(); + var stream = Marten.Internal.SharedMemoryStreamManager.GetStream(); var found = await session.StreamJsonOne(query, stream, context.RequestAborted).ConfigureAwait(false); if (found) { diff --git a/src/Marten/Internal/Sessions/QuerySession.Json.cs b/src/Marten/Internal/Sessions/QuerySession.Json.cs index 4c197b7970..752fdc3f1a 100644 --- a/src/Marten/Internal/Sessions/QuerySession.Json.cs +++ b/src/Marten/Internal/Sessions/QuerySession.Json.cs @@ -32,7 +32,7 @@ public Task StreamJsonMany(ICompiledQuery query, St public async Task ToJsonOne(ICompiledQuery query, CancellationToken token = default) where TDoc : notnull { - var stream = new MemoryStream(); + var stream = SharedMemoryStreamManager.GetStream(); var count = await StreamJsonOne(query, stream, token).ConfigureAwait(false); if (!count) { @@ -46,7 +46,7 @@ public Task StreamJsonMany(ICompiledQuery query, St public async Task ToJsonMany(ICompiledQuery query, CancellationToken token = default) where TDoc : notnull { - var stream = new MemoryStream(); + var stream = SharedMemoryStreamManager.GetStream(); await StreamJsonOne(query, stream, token).ConfigureAwait(false); stream.Position = 0; return await stream.ReadAllTextAsync().ConfigureAwait(false); diff --git a/src/Marten/Internal/SharedMemoryStreamManager.cs b/src/Marten/Internal/SharedMemoryStreamManager.cs new file mode 100644 index 0000000000..67a8ee9f45 --- /dev/null +++ b/src/Marten/Internal/SharedMemoryStreamManager.cs @@ -0,0 +1,14 @@ +using System.IO; +using Microsoft.IO; + +namespace Marten.Internal; + +public static class SharedMemoryStreamManager +{ + private static readonly RecyclableMemoryStreamManager Manager = new(); + + public static MemoryStream GetStream() + { + return Manager.GetStream(); + } +} diff --git a/src/Marten/Linq/MartenLinqQueryable.cs b/src/Marten/Linq/MartenLinqQueryable.cs index 68e3b10b3f..b347df3c43 100644 --- a/src/Marten/Linq/MartenLinqQueryable.cs +++ b/src/Marten/Linq/MartenLinqQueryable.cs @@ -270,7 +270,7 @@ public NpgsqlCommand ToPreviewCommand(FetchType fetchType) public async Task ToJsonArray(CancellationToken token) { - var stream = new MemoryStream(); + var stream = Internal.SharedMemoryStreamManager.GetStream(); await StreamJsonArray(stream, token).ConfigureAwait(false); stream.Position = 0; return await stream.ReadAllTextAsync().ConfigureAwait(false); @@ -298,7 +298,7 @@ public Task StreamJsonSingleOrDefault(Stream destination, CancellationToken public async Task ToJsonFirst(CancellationToken token) { - var stream = new MemoryStream(); + var stream = Internal.SharedMemoryStreamManager.GetStream(); await StreamJsonFirst(stream, token).ConfigureAwait(false); stream.Position = 0; return await stream.ReadAllTextAsync().ConfigureAwait(false); @@ -306,7 +306,7 @@ public async Task ToJsonFirst(CancellationToken token) public async Task ToJsonFirstOrDefault(CancellationToken token) { - var stream = new MemoryStream(); + var stream = Internal.SharedMemoryStreamManager.GetStream(); var actual = await StreamJsonFirstOrDefault(stream, token).ConfigureAwait(false); if (actual == 0) { @@ -319,7 +319,7 @@ public async Task ToJsonFirst(CancellationToken token) public async Task ToJsonSingle(CancellationToken token) { - var stream = new MemoryStream(); + var stream = Internal.SharedMemoryStreamManager.GetStream(); await StreamJsonSingle(stream, token).ConfigureAwait(false); stream.Position = 0; return await stream.ReadAllTextAsync().ConfigureAwait(false); @@ -327,7 +327,7 @@ public async Task ToJsonSingle(CancellationToken token) public async Task ToJsonSingleOrDefault(CancellationToken token) { - var stream = new MemoryStream(); + var stream = Internal.SharedMemoryStreamManager.GetStream(); var count = await StreamJsonSingleOrDefault(stream, token).ConfigureAwait(false); if (count == 0) { diff --git a/src/Marten/Marten.csproj b/src/Marten/Marten.csproj index ac4df25d2b..ab6c4f130c 100644 --- a/src/Marten/Marten.csproj +++ b/src/Marten/Marten.csproj @@ -40,6 +40,7 @@ +