Skip to content

Commit a982c93

Browse files
committed
Minimize sql-script string generations in SqlServerEffectsStore
1 parent dab85eb commit a982c93

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer/SqlServerEffectsStore.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,40 @@ public SqlServerEffectsStore(string connectionString, string tablePrefix = "")
2020
_connFunc = CreateConnection(connectionString);
2121
}
2222

23+
private string? _initializeSql;
2324
public async Task Initialize()
2425
{
2526
await using var conn = await _connFunc();
26-
var sql = @$"
27+
_initializeSql ??= @$"
2728
CREATE TABLE {_tablePrefix}_Effects (
2829
Id NVARCHAR(450) PRIMARY KEY,
2930
Status INT NOT NULL,
3031
Result NVARCHAR(MAX),
3132
Exception NVARCHAR(MAX)
3233
);";
3334

34-
await using var command = new SqlCommand(sql, conn);
35+
await using var command = new SqlCommand(_initializeSql, conn);
3536
try
3637
{
3738
await command.ExecuteNonQueryAsync();
3839
} catch (SqlException exception) when (exception.Number == 2714) {}
3940
}
4041

42+
private string? _truncateSql;
4143
public async Task Truncate()
4244
{
4345
await using var conn = await _connFunc();
44-
var sql = $"TRUNCATE TABLE {_tablePrefix}_Effects";
45-
await using var command = new SqlCommand(sql, conn);
46+
_truncateSql ??= $"TRUNCATE TABLE {_tablePrefix}_Effects";
47+
await using var command = new SqlCommand(_truncateSql, conn);
4648
await command.ExecuteNonQueryAsync();
4749
}
4850

51+
private string? _setEffectResultSql;
4952
public async Task SetEffectResult(FunctionId functionId, StoredEffect storedEffect)
5053
{
5154
var (functionTypeId, functionInstanceId) = functionId;
5255
await using var conn = await _connFunc();
53-
var sql = $@"
56+
_setEffectResultSql ??= $@"
5457
MERGE INTO {_tablePrefix}_Effects
5558
USING (VALUES (@Id,@Status,@Result,@Exception))
5659
AS source (Id,Status,Result,Exception)
@@ -61,7 +64,7 @@ WHEN NOT MATCHED THEN
6164
INSERT (Id, Status, Result, Exception)
6265
VALUES (source.Id, source.Status, source.Result, source.Exception);";
6366

64-
await using var command = new SqlCommand(sql, conn);
67+
await using var command = new SqlCommand(_setEffectResultSql, conn);
6568
var escapedId = Escaper.Escape(functionTypeId.ToString(), functionInstanceId.ToString(), storedEffect.EffectId.ToString());
6669
command.Parameters.AddWithValue("@Id", escapedId);
6770
command.Parameters.AddWithValue("@Status", storedEffect.WorkStatus);
@@ -71,16 +74,17 @@ WHEN NOT MATCHED THEN
7174
await command.ExecuteNonQueryAsync();
7275
}
7376

77+
private string? _getEffectResultsSql;
7478
public async Task<IEnumerable<StoredEffect>> GetEffectResults(FunctionId functionId)
7579
{
7680
await using var conn = await _connFunc();
77-
var sql = @$"
81+
_getEffectResultsSql ??= @$"
7882
SELECT Id, Status, Result, Exception
7983
FROM {_tablePrefix}_Effects
8084
WHERE Id LIKE @IdPrefix";
8185

8286
var idPrefix = Escaper.Escape(functionId.TypeId.Value, functionId.InstanceId.Value) + $"{Escaper.Separator}%";
83-
await using var command = new SqlCommand(sql, conn);
87+
await using var command = new SqlCommand(_getEffectResultsSql, conn);
8488
command.Parameters.AddWithValue("@IdPrefix", idPrefix);
8589

8690
var storedEffects = new List<StoredEffect>();
@@ -101,29 +105,31 @@ public async Task<IEnumerable<StoredEffect>> GetEffectResults(FunctionId functio
101105
return storedEffects;
102106
}
103107

108+
private string? _deleteEffectResultSql;
104109
public async Task DeleteEffectResult(FunctionId functionId, EffectId effectId)
105110
{
106111
await using var conn = await _connFunc();
107-
var sql = @$"
112+
_deleteEffectResultSql ??= @$"
108113
DELETE FROM {_tablePrefix}_Effects
109114
WHERE Id = @Id";
110115

111116
var id = Escaper.Escape(functionId.TypeId.Value, functionId.InstanceId.Value, effectId.Value);
112-
await using var command = new SqlCommand(sql, conn);
117+
await using var command = new SqlCommand(_deleteEffectResultSql, conn);
113118
command.Parameters.AddWithValue("@Id", id);
114119

115120
await command.ExecuteNonQueryAsync();
116121
}
117122

123+
private string? _removeSql;
118124
public async Task Remove(FunctionId functionId)
119125
{
120126
await using var conn = await _connFunc();
121-
var sql = @$"
127+
_removeSql ??= @$"
122128
DELETE FROM {_tablePrefix}_Effects
123129
WHERE Id LIKE @Id";
124130

125131
var id = Escaper.Escape(functionId.TypeId.Value, functionId.InstanceId.Value) + $"{Escaper.Separator}%" ;
126-
await using var command = new SqlCommand(sql, conn);
132+
await using var command = new SqlCommand(_removeSql, conn);
127133
command.Parameters.AddWithValue("@Id", id);
128134

129135
await command.ExecuteNonQueryAsync();

0 commit comments

Comments
 (0)