0

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

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

该应用程序对于具有 8 个视图的少量用户运行良好,但是当我增加数量时,SqlConnection.Open 中发生超时异常,因为连接池中没有可用的连接。

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

有没有办法增加数据库连接的数量?好像800是最高的!!从您的角度来看,我怎样才能增加用户数量?

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

PS:

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

根据答案:

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

之后:

我尝试了两种解决方案

  1. 每个方法调用打开和关闭 sql 连接
  2. 增加连接字符串中连接池的大小

但是,如果我增加用户数量,两者都会给我带来延迟,同时我监控 sql porfiler 中的查询,似乎每个查询不会超过 20 毫秒。

4

6 回答 6

4

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

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

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

于 2009-05-10T11:00:15.383 回答
1

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

Jon Skeet 的.NET 中的多线程:介绍和建议也很棒

于 2009-05-10T10:47:10.750 回答
1

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

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

于 2009-05-10T13:17:15.353 回答
1

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

data source=RemoteHostName;initial catalog=myDb;password=sa;user id=sa;
Max pool size = 200; 
于 2009-05-10T18:01:53.280 回答
1

找到一篇关于 SQL Server Connection Pooling (ADO.NET) 的文章,您可能会觉得它很有用。

SQL Server 连接池 (ADO.NET)

于 2009-05-11T07:49:50.337 回答
0

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

  1. 最大化连接池大小
  2. 为客户端创建单个代理对象并串行而不是并行发送他的请求
  3. 优化 sql 查询并在服务端使用一些缓存
于 2009-05-23T07:53:26.537 回答