Skip to content

Commit 985fa04

Browse files
committed
Minimize sql-script string generations in MySqlMessageStore
1 parent b488a6d commit 985fa04

File tree

1 file changed

+29
-31
lines changed

1 file changed

+29
-31
lines changed

Stores/MySQL/Cleipnir.ResilientFunctions.MySQL/MySqlMessageStore.cs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ public MySqlMessageStore(string connectionString, string tablePrefix = "")
1717
_tablePrefix = tablePrefix.ToLower();
1818
}
1919

20+
private string? _initializeSql;
2021
public async Task Initialize()
2122
{
2223
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
23-
var sql = @$"
24+
_initializeSql ??= @$"
2425
CREATE TABLE IF NOT EXISTS {_tablePrefix}rfunctions_messages (
2526
function_type_id VARCHAR(255),
2627
function_instance_id VARCHAR(255),
@@ -30,26 +31,29 @@ message_type VARCHAR(255) NOT NULL,
3031
idempotency_key VARCHAR(255),
3132
PRIMARY KEY (function_type_id, function_instance_id, position)
3233
);";
33-
var command = new MySqlCommand(sql, conn);
34+
var command = new MySqlCommand(_initializeSql, conn);
3435
await command.ExecuteNonQueryAsync();
3536
}
3637

38+
private string? _dropUnderlyingTableSql;
3739
public async Task DropUnderlyingTable()
3840
{
3941
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
40-
var sql = $"DROP TABLE IF EXISTS {_tablePrefix}rfunctions_messages";
41-
await using var command = new MySqlCommand(sql, conn);
42+
_dropUnderlyingTableSql ??= $"DROP TABLE IF EXISTS {_tablePrefix}rfunctions_messages";
43+
await using var command = new MySqlCommand(_dropUnderlyingTableSql, conn);
4244
await command.ExecuteNonQueryAsync();
4345
}
44-
46+
47+
private string? _truncateTableSql;
4548
public async Task TruncateTable()
4649
{
4750
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);;
48-
var sql = @$"TRUNCATE TABLE {_tablePrefix}rfunctions_messages;";
49-
var command = new MySqlCommand(sql, conn);
51+
_truncateTableSql ??= $"TRUNCATE TABLE {_tablePrefix}rfunctions_messages;";
52+
var command = new MySqlCommand(_truncateTableSql, conn);
5053
await command.ExecuteNonQueryAsync();
5154
}
5255

56+
private string? _appendMessageSql;
5357
public async Task<FunctionStatus> AppendMessage(FunctionId functionId, StoredMessage storedMessage)
5458
{
5559
for (var i = 0; i < 10; i++) //retry if deadlock is occurs
@@ -59,7 +63,7 @@ public async Task<FunctionStatus> AppendMessage(FunctionId functionId, StoredMes
5963
var (messageJson, messageType, idempotencyKey) = storedMessage;
6064
//https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_get-lock
6165
var lockName = functionId.ToString().GenerateSHA256Hash();
62-
var sql = @$"
66+
_appendMessageSql ??= @$"
6367
SELECT GET_LOCK(?, 10);
6468
INSERT INTO {_tablePrefix}rfunctions_messages
6569
(function_type_id, function_instance_id, position, message_json, message_type, idempotency_key)
@@ -72,7 +76,7 @@ INSERT INTO {_tablePrefix}rfunctions_messages
7276
FROM {_tablePrefix}rfunctions
7377
WHERE function_type_id = ? AND function_instance_id = ?;";
7478

75-
await using var command = new MySqlCommand(sql, conn)
79+
await using var command = new MySqlCommand(_appendMessageSql, conn)
7680
{
7781
Parameters =
7882
{
@@ -110,17 +114,18 @@ INSERT INTO {_tablePrefix}rfunctions_messages
110114

111115
throw new ConcurrentModificationException(functionId);
112116
}
113-
117+
118+
private string? _replaceMessageSql;
114119
public async Task<bool> ReplaceMessage(FunctionId functionId, int position, StoredMessage storedMessage)
115120
{
116121
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
117122
var (messageJson, messageType, idempotencyKey) = storedMessage;
118123

119-
var sql = @$"
124+
_replaceMessageSql ??= @$"
120125
UPDATE {_tablePrefix}rfunctions_messages
121126
SET message_json = ?, message_type = ?, idempotency_key = ?
122127
WHERE function_type_id = ? AND function_instance_id = ? AND position = ?";
123-
await using var command = new MySqlCommand(sql, conn)
128+
await using var command = new MySqlCommand(_replaceMessageSql, conn)
124129
{
125130
Parameters =
126131
{
@@ -135,40 +140,32 @@ public async Task<bool> ReplaceMessage(FunctionId functionId, int position, Stor
135140
var affectedRows = await command.ExecuteNonQueryAsync();
136141
return affectedRows == 1;
137142
}
138-
143+
144+
private string? _truncateSql;
139145
public async Task Truncate(FunctionId functionId)
140146
{
141147
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
142-
await Truncate(functionId, conn, transaction: null);
143-
}
144-
145-
internal async Task<int> Truncate(FunctionId functionId, MySqlConnection connection, MySqlTransaction? transaction)
146-
{
147-
var sql = @$"
148+
_truncateSql ??= @$"
148149
DELETE FROM {_tablePrefix}rfunctions_messages
149150
WHERE function_type_id = ? AND function_instance_id = ?";
150151

151-
await using var command =
152-
transaction == null
153-
? new MySqlCommand(sql, connection)
154-
: new MySqlCommand(sql, connection, transaction);
155-
152+
await using var command = new MySqlCommand(_truncateSql, conn);
156153
command.Parameters.Add(new() { Value = functionId.TypeId.Value });
157154
command.Parameters.Add(new() { Value = functionId.InstanceId.Value });
158155

159-
var affectedRows = await command.ExecuteNonQueryAsync();
160-
return affectedRows;
156+
await command.ExecuteNonQueryAsync();
161157
}
162-
158+
159+
private string? _getMessagesSql;
163160
public async Task<IReadOnlyList<StoredMessage>> GetMessages(FunctionId functionId, int skip)
164161
{
165162
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
166-
var sql = @$"
163+
_getMessagesSql ??= @$"
167164
SELECT message_json, message_type, idempotency_key
168165
FROM {_tablePrefix}rfunctions_messages
169166
WHERE function_type_id = ? AND function_instance_id = ? AND position >= ?
170167
ORDER BY position ASC;";
171-
await using var command = new MySqlCommand(sql, conn)
168+
await using var command = new MySqlCommand(_getMessagesSql, conn)
172169
{
173170
Parameters =
174171
{
@@ -191,14 +188,15 @@ public async Task<IReadOnlyList<StoredMessage>> GetMessages(FunctionId functionI
191188
return storedMessages;
192189
}
193190

191+
private string? _hasMoreMessagesSql;
194192
public async Task<bool> HasMoreMessages(FunctionId functionId, int skip)
195193
{
196194
await using var conn = await DatabaseHelper.CreateOpenConnection(_connectionString);
197-
var sql = @$"
195+
_hasMoreMessagesSql ??= @$"
198196
SELECT COALESCE(MAX(position), -1)
199197
FROM {_tablePrefix}rfunctions_messages
200198
WHERE function_type_id = ? AND function_instance_id = ?;";
201-
await using var command = new MySqlCommand(sql, conn)
199+
await using var command = new MySqlCommand(_hasMoreMessagesSql, conn)
202200
{
203201
Parameters =
204202
{

0 commit comments

Comments
 (0)