期间我有以下相关项目一个C#WinForms应用程序:超时与已部署的代码,但不进行调试
- VS2010 SP1,.NET 3.5
- 功能NHibernate 1.0(与NH 3.0,这也许是部分这个问题)的
- 部署的ClickOnce
- 的SQL Server 2008 R2数据库
我已在马安装已部署副本chine(通过ClickOnce),并通过VS2010调试器并行运行另一个副本。它是相同的代码库。我昨天刚刚发布,自发布以来没有更改过任何代码。
在指向同一台SQL Server实例的同一台机器上(再次并行运行),我的应用程序的部署副本超时尝试写入数据库。通过调试器开始的复制写得很好。每次都是可重复的。
在现实世界中,只有几个人报告超时。他们在同一个部门,就在大楼的同一个地方。他们是唯一的(好吧,我知道)。我使用相同的SQL实例来调试他们正在使用的。
解决方案中所有项目的部署中都包含所有文件(.pdb的除外)。
这是外层的异常(我没有一个内部异常尚)堆栈跟踪:
Stack Trace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
什么可能会导致超时在一个而不是其他?在同一台机器上,同时运行(或者一个接一个地运行)。我甚至在build \ bin \文件夹中本地运行它,没有超时,就像通过调试器一样。只有部署的副本会产生超时。
UPDATE:
我已经能够捕获SQL事件探查器跟踪生产环境,一切都让到SQL除了实际写入到数据库中,这并在后台线程上发生。执行保存的方法(可以包含INSERTS和/或UPDATES的组合)正如我在跟踪中看到的那样,在保存完成之前运行的那个方法中的查询中被调用。我正在努力捕获整个异常堆栈。
更新2:
我终于在调试器重现该错误,并已分离出的异常被抛出在哪里。上面提到的查询在保存前立即发生,导致超时。这很好,现在我可以解决这个问题并继续前进。
但问题仍然存在:为什么它在运行发布代码的进程中引发,而不是在运行完全相同的代码库的调试过程中引发。
也许您的部署版本指向另一个数据库。你可以在访问数据库之前添加一个代码来显示连接字符串(例如使用MessageBox.Show())? – Adi 2011-05-11 21:32:45
@Adi我在应用程序中显示了所有连接信息的“关于”屏幕。这一切都是一样的,我证实了... – squillman 2011-05-11 21:34:11
@squillman嗯,我看到很多“奇怪”的事情,最不可能发生的事情实际上正在发生......所以只要这是一个简单的方法,我会实现访问数据库之前的消息框。我不想推动你,虽然... – Adi 2011-05-11 21:36:16