期間我有以下相關項目一個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