2011-05-11 48 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核心(等等),再次可能導致執行順序的微妙變化。

所有這些都是瘋狂的猜測,沒有深入代碼,但多線程往往是這些類型的「神祕」問題的罪魁禍首。

相關問題