我们有一个围绕NHibernate和Npgsql提供程序构建的Web应用程序,它在服务器2008 R2和.NET 4上运行良好。我们现在已经升级到Server 2012和4.5堆栈,并且正在经历奇怪的挂起数据库层。
我们的测试服务器(服务器2012的虚拟实例)上的线程将永久冻结,并且在生产服务器上挂起约7.5或15分钟(约450秒或900秒)(我只知道这是因为它通常会在日志中说明。
当我设法在我的测试服务上重现这个并附加调试器时,我发现一个线程将处于以下状态:
[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(最新的稳定版)。
这种挂起的原因是什么,以及这种极长的超时(或测试中没有超时)?为什么不同的操作系统会有所不同?
我们之前在一台服务器上使用.NET 4.5在服务器2008 R2上运行了这个,并且从未看到过这种行为。但我认为,因为这是一个Native调用,它依赖于OS?
有没有人知道为什么会发生这种情况?
答案 0 :(得分:0)
要检查的事项:
锁定服务器端。
网络中断和超时。
服务器的响应能力。
长时间运行的查询。