2011-05-11 56 views
6

期间我有以下相关项目一个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:
我终于在调试器重现该错误,并已分离出的异常被抛出在哪里。上面提到的查询在保存前立即发生,导致超时。这很好,现在我可以解决这个问题并继续前进。

但问题仍然存在:为什么它在运行发布代码的进程中引发,而不是在运行完全相同的代码库的调试过程中引发。

+0

也许您的部署版本指向另一个数据库。你可以在访问数据库之前添加一个代码来显示连接字符串(例如使用MessageBox.Show())? – Adi 2011-05-11 21:32:45

+0

@Adi我在应用程序中显示了所有连接信息的“关于”屏幕。这一切都是一样的,我证实了... – squillman 2011-05-11 21:34:11

+0

@squillman嗯,我看到很多“奇怪”的事情,最不可能发生的事情实际上正在发生......所以只要这是一个简单的方法,我会实现访问数据库之前的消息框。我不想推动你,虽然... – Adi 2011-05-11 21:36:16

回答

0

我有与数据库连接相同的问题。

我听到我的用户说他们有完全相同的异常。 一开始我不知道什么是错的。

的解决方案是,他们没有连接VPN他们的钥匙

问候 亚当

+0

谢谢,但这都是内部的。 – squillman 2011-05-16 19:07:48

1

当您使用调试模式,请求超时是无限的,但不是当你通过它运行的情况下发布版本。

如果Web服务被调用来写入数据库,请增加您的请求超时时间,如果没有,请在web.config或您放置连接字符串的任何位置增加数据库的连接超时时间。

问候, 摄影指导Vinit

+0

这不是一个web应用程序,它是winforms。 – squillman 2011-05-18 20:06:38

0

你提到写在后台线程数据库,这使我觉得这可能是并发(多线程)的问题不知何故。

发布版本通常被优化,这就是为什么它们可能与调试版本稍有不同。这可能会导致现有的并发问题成为一个实际问题。不同的用户有不同的硬件,不同数量的CPU核心(等等),再次可能导致执行顺序的微妙变化。

所有这些都是疯狂的猜测,没有深入代码,但多线程往往是这些类型的“神秘”问题的罪魁祸首。

相关问题