npgsql事务中的附加语句

时间:2014-05-06 18:09:32

标签: c# postgresql npgsql

在使用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'

1 个答案:

答案 0 :(得分:0)

发送Unlisten以清除之前在将连接返回到池之前可能已设置的任何通知的连接。

发送选择Npgsql以测试从池中获取连接时连接是否仍然有效。您可以在此处找到代码:https://github.com/npgsql/Npgsql/blob/e7913234bd1a406dc6288147fb24b52c041abd26/Npgsql/Npgsql/NpgsqlConnector.cs#L372

它曾经是一个简单的“选择1”,但我们开始收到报告称返回的连接已被破坏,我们认为原因是池中放入了值为“1”的断开连接当Npgsql读取查询的响应时,它实际上正在读取此左值并返回误报。那是我们决定使用随机值进行测试的时候。但是性能明智,我愿意接受有关进行这种简单验证测试的更好方法的建议。也许使用其他类型的签名?

我希望它有所帮助。