在使用Npgsql和我们的Postgres服务器进行概要分析(在数据库端)客户端之间的通信时,我看到在每次事务中都会运行一些其他语句。
示例日志:
LOG: statement: select 'Npgsql155171'
LOG: duration: 0.136 ms
LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
LOG: duration: 0.060 ms
...
LOG: statement: unlisten *
LOG: duration: 0.049 ms
这两个陈述是最初的"选择' Npgsql155171'"和#34; unlisten *"。
这两个陈述绝对必要吗?有谁知道他们做了什么?
修改
每个事务似乎都在查询不同的字符串。我无法在任何地方找到它们。它们也不是连续的。
此后的下两个交易运行了这些陈述:
LOG: statement: select 'Npgsql213141'
...
LOG: statement: select 'Npgsql223203'
答案 0 :(得分:0)
发送Unlisten以清除之前在将连接返回到池之前可能已设置的任何通知的连接。
发送选择Npgsql以测试从池中获取连接时连接是否仍然有效。您可以在此处找到代码:https://github.com/npgsql/Npgsql/blob/e7913234bd1a406dc6288147fb24b52c041abd26/Npgsql/Npgsql/NpgsqlConnector.cs#L372
它曾经是一个简单的“选择1”,但我们开始收到报告称返回的连接已被破坏,我们认为原因是池中放入了值为“1”的断开连接当Npgsql读取查询的响应时,它实际上正在读取此左值并返回误报。那是我们决定使用随机值进行测试的时候。但是性能明智,我愿意接受有关进行这种简单验证测试的更好方法的建议。也许使用其他类型的签名?
我希望它有所帮助。