2012-07-01 94 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