【问题标题】:Is there a specific design pattern to help manage external connection and concurrent requests?是否有特定的设计模式来帮助管理外部连接和并发请求?
【发布时间】:2013-02-27 20:58:28
【问题描述】:

我目前正在为 Web 应用程序使用外部 API。当用户单击一个按钮时,我打开连接,进行适当的调用,然后关闭连接。这可以正常工作,但是,在多线程 Web 环境中,当同时单击两次时,应用程序崩溃...这是由于连续调用关闭连接所致。

理想情况下,我想在第一个请求上打开一个连接,然后进行所有调用。如果有一个并发请求进来,并且它看到有一个打开的连接,那么它应该使用它。连接应该然后仅当当前没有处理请求时才关闭。

我开始编写一些代码来实现我想要的,但我想知道是否有任何人知道的特定设计模式来解决这个问题,或者是否有人有任何建议......谢谢!!

【问题讨论】:

  • 您使用什么编程语言和平台?我相信大多数平台都支持连接池 - “连接”是什么意思,它是应用程序会话吗?
  • @BorisTreukhov,我正在使用 C# 和 ASP .NET MVC3。我正在使用一些第三方库,它们基本上有 3 个命令:1.ConnectSocket、2.TransferData、3.DisconnectSocket ... 通过连接,我的意思是第三方 API 来打开套接字连接。所以问题在于当连续调用 DisconnectSocket 时,第 3 方库崩溃,这是我在多线程设置中看到的一个问题......就像一个 Web 应用程序。
  • 我的第一个想法是连接池加命令模式
  • 你不能在调用DisconnectSocket之前检查连接是否“未关闭”吗?另外你确定这个连接是线程安全的吗?
  • 在多线程设置中,我会考虑使用基于队列和消息的设置来完全将您的应用程序从底层数据存储中抽象出来,并让您更轻松地进行扩展。

标签: c# multithreading design-patterns


【解决方案1】:

我猜你正在寻找locking
我不知道我头顶上有合适的图案。

【讨论】:

  • 锁定不会阻塞其他请求吗?
  • @Ramunas 是的。这样你就可以计算你有多少连接。
【解决方案2】:

1- 为每个请求建立新连接的成本是多少?

2-图书馆作者是否发布了任何指南来限制连接数? 如果不是,那么完全不在您的设计中引入锁定或多线程将非常有帮助。

这是我在深入研究多线程场景之前问自己的最初问题。

同样在你上面解释的情况下,你永远无法确定下一个请求何时到来,所以如果你使用类的单个对象,那么使用维基百科中解释的双重检查锁定技术会很有帮助

Double Check Locking

【讨论】:

  • +1 用于“昂贵”问题。如果我们谈论的是 sqlserver 连接,它们已经被池化了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多