Skip to content

Commit 91d2e78

Browse files
committed
rewrite pg_notify to use unnest rather than batch
1 parent 61d62a8 commit 91d2e78

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

src/HotChocolate/Core/src/Subscriptions.Postgres/PostgresChannelWriter.cs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,30 +93,42 @@ private async Task HandleMessage(NpgsqlConnection connection, CancellationToken
9393
// firstMessage that was already read from the channel
9494
ct.ThrowIfCancellationRequested();
9595

96-
await using var batch = connection.CreateBatch();
96+
var payloads = new string[messages.Count];
9797

98-
foreach (var message in messages)
98+
for (var i = 0; i < messages.Count; i++)
9999
{
100-
var command = batch.CreateBatchCommand();
100+
payloads[i] = messages[i].FormattedPayload;
101+
}
102+
103+
const string sql =
104+
"""
105+
SELECT
106+
pg_notify(t.channel, t.message)
107+
from
108+
(select
109+
@channel as channel,
110+
unnest(@messages) as message
111+
) as t;
112+
""";
113+
114+
await using var command = connection.CreateCommand();
101115

102-
command.CommandText = "SELECT pg_notify(@channel, @message);";
116+
command.CommandText = sql;
103117

104-
var channel = new NpgsqlParameter("channel", DbType.String)
118+
command.Parameters.Add(
119+
new NpgsqlParameter("channel", NpgsqlDbType.Text)
105120
{
106121
Value = _channelName
107-
};
108-
var msg = new NpgsqlParameter("message", DbType.String)
109-
{
110-
Value = message.FormattedPayload
111-
};
112-
command.Parameters.Add(channel);
113-
command.Parameters.Add(msg);
122+
});
114123

115-
batch.BatchCommands.Add(command);
116-
}
124+
command.Parameters.Add(
125+
new NpgsqlParameter("messages", NpgsqlDbType.Array | NpgsqlDbType.Varchar)
126+
{
127+
Value = payloads
128+
});
117129

118-
await batch.PrepareAsync(ct);
119-
await batch.ExecuteNonQueryAsync(ct);
130+
await command.PrepareAsync(ct);
131+
await command.ExecuteNonQueryAsync(ct);
120132
}
121133
catch (Exception ex)
122134
{

0 commit comments

Comments
 (0)