2012-07-01 96 views
2

我需要一些幫助才能指出正確的方向。帶有共享業務對象的WCF每次呼叫服務

我們希望通過暴露結束WebHTTP點服務功能(它由讀+更新SQL Server數據庫)爲每個呼叫的服務於廣大用戶。 如果可以避免的話,我們不想使用SOAP,因爲我們在其他平臺上進行交互操作時遇到麻煩。 這必須可擴展到1000多個用戶,在這種情況下,他們不太可能提交多個併發請求。據估計,在任何給定時間,應該有最多25個併發請求。

(這就是爲什麼每個會話的服務被排除了,因爲雖然只執行25的動作,將意味着保持1000+會話開放。)

通過與測試服務經驗,我們卻發現,在使用基於HTTP的純Per-Call WCF服務表現不佳,最大的時間延遲是SQL服務器連接的初始化。

這與Web服務器通常會遇到的情況類似。 因此,使用與Web服務器類似的方法似乎是明智的 - 出於性能方面的原因,它們使HTTP引擎池保持活動狀態,並且正在爲傳入請求分配池中的其中一個引擎。

因此,我們要保持25-30「業務邏輯對象」一池(即班,從單純的服務接口分離的實際業務邏輯)開放應在服務主機啓動時實例化。

似乎WCF沒有內置的場景中,支持這一開箱即用。 我該怎麼辦?

當我自我託管,我可以得出從ServiceHost的自定義類,並添加一個詞典與業務對象。這將導致線程問題,我想,我將不得不處理手動同步,是否正確?

如果我們決定在IIS中託管,那麼我該怎麼做呢,因爲IIS自動負責創建ServiceHost類的一個實例,因此我沒有太多的機會將我自己的自定義主機置於其中,之間,是嗎?

或者這是一個不好的方法。任何其他想法讚賞。

回答

2

實際上是無狀態,無會話方法的瓶頸嗎?

「業務邏輯對象」池對我來說不是一個好主意。您將面臨難以調試的併發問題。

您是否真的測試過以下模式?每個請求

  • 一個業務邏輯對象,最短壽命儘可能
  • 每個業務邏輯對象
  • 一個SQL連接
  • 無國籍服務

通過與測試服務經驗,我們卻發現,使用純粹的 通過HTTP的每個呼叫WCF服務表現不佳,最大時間爲SQL服務器連接的初始化時間。

真的,SQL服務器連接不應該是SQL Server連接池的瓶頸。

+0

一個醜陋的事實似乎在這裏落後 - 如果在無狀態的每個調用WCF服務中實現數據庫連接池,則不起作用。在每次服務調用時,每次打開SQL服務器連接需要2.5秒。在Windows窗體中使用完全相同的代碼在第一次調用時打開時間爲2.5秒,後續調用爲:零毫秒。顯然,「連接池」位於由我的服務(!)創建的ADO.NET對象中,因此在調用結束時會被破壞!無論如何,我需要以某種方式實例化主機中的連接? – nepdev

+0

@ user1494665這不是連接池應該如何工作。請參閱http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx 也許你應該發佈實例化連接的代碼? – ken2k

+0

連接實例化是標準的SqlConnection c = new SqlConnection()。現在通過明確聲明「Pooling = true」和非零的「Min Pool Size」來讓它自行工作。我「應該」不必明確說明這一點 - 但我必須。否則,對於完全無狀態的方法,您完全正確,現在我的測試完全可以接受,現在連接池可以工作。 – nepdev

0

我不認爲他們會實例化業務邏輯對象成本很高。你可以在ken指向的sql連接對象上啓用連接池。最好去緩存業務對象,而不是集中業務邏輯對象。

+0

如上所述,啓用了池化功能 - 但不起作用,正如我的評論所述。你能指出一些關於如何說「緩存」的參考嗎?我的業務對象不是數據,而是代碼,所以我不確定如何緩存它? – nepdev