如何增加系统用户数?

时间:2009-05-10 10:41:33

标签: .net sql-server wcf client-server

我有一个依赖于MS SQL数据库进行后端存储的客户端/服务器应用程序,服务器应用程序是一个WCF TCP服务,它通过从数据库信息集中选择来处理客户端请求。

该服务配置为PerSession并支持500个会话。 在客户端,用户可以打开不同的视图,每个视图都有我的服务对象(代理对象),因此每个视图都是一个会话;每个视图都有一个Threading计时器,它每秒使用代理对象从服务器请求数据。

该应用程序适用于少量拥有8个视图的用户,但是当我增加数量时,SqlConnection.Open中出现超时异常,因为连接池中没有可用的连接。

每个视图都有会话/对象,因为WCF服务不是线程安全的;它取决于使用SqlDataReaders和SqlAdapters的单线程数据库访问层。

有没有办法增加数据库连接数?看来800是最大的!!从您的角度来看,如何增加用户数?

我应该更改数据库层并使其成为多线程并使WCF服务单一吗? 我认为这是设计的瓶颈(你能推荐一篇ADO.net中的多线程文章)

P.S:

我可以用内存数据库或任何更快的存储空间替换数据库吗?

根据答案:

我改变后端服务以关闭每个方法调用的连接,但是我遇到了同样的问题,因为用户数增加了延迟增加(超过一秒),这是否意味着我必须更改数据库解决方案?什么是替代解决方案?。

之后:

我尝试了两种解决方案

  1. 按方法调用打开和关闭sql连接
  2. 增加连接字符串中连接池的大小
  3. 但是如果增加用户数量,两者都会给我延迟,同时我监控sql porfiler中的查询,看起来每个查询的时间不会超过20毫秒。

6 个答案:

答案 0 :(得分:4)

不是为每个会话保持数据库连接打开,而是在每次客户端调用结束时关闭它,以便将连接返回到连接池。 (在池中时连接不会完全关闭,因此在重用时重新连接它很快。)

这样每个会话只会在真正需要时使用连接。您应该会看到特定数量的会话所需的连接数量急剧减少,并且您的应用程序应该能够处理更多会话。

此外,由于会话不会保留连接,因此您对会话数量没有绝对限制。如果会话需要时没有可用的连接,它将重试一段时间,直到有一个可用。只有当服务器真正过载(即请求的速度超过服务器可以处理它们)很长一段时间,你才会收到超时错误。

答案 1 :(得分:1)

最好的免费在线多线程书籍之一是Joe Albahari的Threading in C#

Jon Skeet的Multi-threading in .NET: Introduction and suggestions也很棒

答案 2 :(得分:1)

积极关闭联系。使用在连接,命令,数据引用器等上调用IDisposable和.Close的块或try / finally块,仔细检查包装实现IDisposible的所有ADO.NET组件。

800个开放连接是一个连接泄漏,除非你有像VISA或谷歌的同时交易数量的人。

答案 3 :(得分:1)

我必须同意早期的海报,你应该考虑关闭连接。同时,您可以在connectionstring中指定连接池大小:Max Pool Size

data source=RemoteHostName;initial catalog=myDb;password=sa;user id=sa;
Max pool size = 200; 

答案 4 :(得分:1)

找到一篇关于SQL Server连接池(ADO.NET)的文章,您可能会发现它很有用。

SQL Server Connection Pooling (ADO.NET)

答案 5 :(得分:0)

经过一系列实验后,我通过一组更改增加了系统用户数800%

  1. 最大化连接池大小
  2. 为客户端创建单个代理对象,并以串行不并行方式发送他的请求
  3. 优化sql查询并在服务端使用一些缓存