我有一个依赖于MS SQL数据库进行后端存储的客户端/服务器应用程序,服务器应用程序是一个WCF TCP服务,它通过从数据库信息集中选择来处理客户端请求。
该服务配置为PerSession并支持500个会话。 在客户端,用户可以打开不同的视图,每个视图都有我的服务对象(代理对象),因此每个视图都是一个会话;每个视图都有一个Threading计时器,它每秒使用代理对象从服务器请求数据。
该应用程序适用于少量拥有8个视图的用户,但是当我增加数量时,SqlConnection.Open中出现超时异常,因为连接池中没有可用的连接。
每个视图都有会话/对象,因为WCF服务不是线程安全的;它取决于使用SqlDataReaders和SqlAdapters的单线程数据库访问层。
有没有办法增加数据库连接数?看来800是最大的!!从您的角度来看,如何增加用户数?
我应该更改数据库层并使其成为多线程并使WCF服务单一吗? 我认为这是设计的瓶颈(你能推荐一篇ADO.net中的多线程文章)
P.S:
我可以用内存数据库或任何更快的存储空间替换数据库吗?
根据答案:
我改变后端服务以关闭每个方法调用的连接,但是我遇到了同样的问题,因为用户数增加了延迟增加(超过一秒),这是否意味着我必须更改数据库解决方案?什么是替代解决方案?。
之后:
我尝试了两种解决方案
但是如果增加用户数量,两者都会给我延迟,同时我监控sql porfiler中的查询,看起来每个查询的时间不会超过20毫秒。
答案 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)的文章,您可能会发现它很有用。
答案 5 :(得分:0)
经过一系列实验后,我通过一组更改增加了系统用户数800%