套接字接收挂起在windows 2012下的.NET 4.5中

套接字接收挂起在windows 2012下的.NET 4.5中,.net,postgresql,windows-server-2012,npgsql,.net,Postgresql,Windows Server 2012,Npgsql,我们有一个围绕NHibernate和Npgsql提供程序构建的web应用程序,它在Server2008R2和.NET4上运行良好。我们现在已经升级到Server2012和4.5堆栈,并且在数据库层中遇到了奇怪的挂起 我们的线程将永远冻结在我的测试服务器服务器2012服务器的虚拟实例上,大约挂起7.5或15分钟450秒或900秒,大约挂在生产服务器上我只知道这一点,因为它通常会在日志中显示 当我设法在testservice上复制该线程并附加调试器时,我看到一个线程将处于以下状态: [Managed

我们有一个围绕NHibernate和Npgsql提供程序构建的web应用程序,它在Server2008R2和.NET4上运行良好。我们现在已经升级到Server2012和4.5堆栈,并且在数据库层中遇到了奇怪的挂起

我们的线程将永远冻结在我的测试服务器服务器2012服务器的虚拟实例上,大约挂起7.5或15分钟450秒或900秒,大约挂在生产服务器上我只知道这一点,因为它通常会在日志中显示

当我设法在testservice上复制该线程并附加调试器时,我看到一个线程将处于以下状态:

[Managed to Native Transition]   
System.dll!System.Net.Sockets.Socket.Receive(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, out System.Net.Sockets.SocketError errorCode)  
System.dll!System.Net.Sockets.NetworkStream.Read(byte[] buffer, int offset, int size)    
mscorlib.dll!System.IO.BufferedStream.ReadByte()     
Npgsql.dll!Npgsql.NpgsqlState.ProcessBackendResponses_Ver_3.MoveNext()   
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.GetNextResponseObject()     
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.GetNextRowDescription()     
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.NextResult()    
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.ForwardsOnlyDataReader(System.Collections.Generic.IEnumerable<Npgsql.IServerResponseObject> dataEnumeration, System.Data.CommandBehavior behavior, Npgsql.NpgsqlCommand command, Npgsql.NpgsqlConnector.NotificationThreadBlock threadBlock, bool synchOnReadError)     
Npgsql.dll!Npgsql.NpgsqlCommand.GetReader(System.Data.CommandBehavior cb)    
Npgsql.dll!Npgsql.NpgsqlCommand.ExecuteBlind()   
Npgsql.dll!Npgsql.NpgsqlTransaction.Rollback()   
NHibernate.dll!NHibernate.Transaction.AdoTransaction.Rollback() 
在postgres端,我还看到一个正在运行的查询,但我猜这是因为事务从未回滚。我们使用的是Npgsql v2.0.12最新的稳定版本

导致此挂起的原因是什么,以及测试中超时过长或缺少超时?为什么在不同的操作系统上会有所不同

我们以前在一台服务器上使用.NET4.5在Server2008R2上运行过此操作,但也从未见过这种行为。但我假设这是一个本机调用,它依赖于操作系统


有人知道为什么会发生这种情况吗?

需要检查的事项:

服务器端的锁

网络中断和超时

服务器上的响应能力

长时间运行的查询


我建议看看服务器端发生了什么(如果有的话)。查询是否在pg_stat_活动中等待一个lock waiting=t;pg_锁中的详细信息?在Linux上,我会连接gdb,看看服务器是否也在等待从客户端接收数据;在这种情况下,它强烈建议出现nPgSQL错误。不幸的是,在Windows上执行此操作更为复杂和困难。感谢您的回复。没有锁,相关的查询通常只是一个空的结果集,不需要花时间执行。这是与Server2008R2一起使用的同一台DB服务器,在这里我们没有遇到类似的问题,它可能也挂起了,但确实及时超时。我的意思是,一个套接字的端点由于某种原因而死亡,应该在某个时候处理,对吗?使用stackstrace,它看起来像Npgsql.dll中的一个bug,没有正确设置它应该设置的超时,或者与2012网络堆栈不兼容。2012年,出现了阻塞网络的新概念。例如,对于非管理员,对127.0.0.1的请求默认都被拒绝。。。因此,也许你应该给运行你的应用程序的用户更多的权限。试着给它管理员权限,看看是否是这种问题,然后你就可以细化你的用户权限。@Softlion这很有趣,你有关于它的链接吗?然而,我们不做任何环回连接,但我同意这可能是Npgsql中的一个潜在缺陷。我已经搜索了有关超时的文档,但没有找到任何东西。然而,它在2008年之前就已经起作用了,所以我想知道2012年是否有一些默认设置发生了变化。