【问题标题】:DataSnap server - share DB connection or new connection per client request?DataSnap 服务器 - 每个客户端请求共享数据库连接或新连接?
【发布时间】:2012-07-26 08:42:35
【问题描述】:

我有一个 Delphi XE2 DataSnap 服务器(Windows 服务)连接到后端 MS SQL Server 2008(相同的服务器框)服务 ​​REST 客户端请求。
一段时间以来一切都很好,直到最近,我遇到了一个问题,DataSnap 服务由于某种原因失去了与 SQL Server 的连接。

服务无法重新建立连接,我必须重新启动 DataSnap 服务才能继续。
这让我开始思考,因为目前该服务仅使用 1 个 SQL 连接 (TADOConnection) 共享给所有客户端请求。我这样做是因为我不希望为每个客户端请求实例化一个新的 SQL 连接的开销。

我正在考虑是否为每个请求建立一个单独的 SQL 连接实际上是否更好,并且开销是否明显 - 任何人都可以对此发表评论/建议吗?

【问题讨论】:

  • 多线程服务器应用程序中一种非常流行的技术是使用数据库连接池,它提供了许多预配置的、即用型的连接。高级实现还可以验证数据库服务器是否仍然可以访问,通常使用 ping SQL 语句。
  • 当然,这完全取决于您有多少客户请求。您是在阅读还是在更新数据库?如果没有多少请求,我会为每个客户端在运行时实例化自己的 SQL 连接。在这种情况下,无论出于何种原因,您都不会为失去与数据库的连接而烦恼。我想数据库连接是通过 tcp 的?但是 REST 是无状态的。在这种情况下,如何为所有客户端请求共享数据库连接?您是否为此使用关键部分?也许您的问题与多线程问题有关。

标签: sql delphi rest ado datasnap


【解决方案1】:

这就是拥有一个结构良好的数据访问层的地方,可以对其进行修改以尝试不同的方法并将您的数据库连接与您的其余代码隔离开来。

如果您使用 MIDAS (DataSnap) 从客户端到 DataSnap 服务器,强烈建议您使用池化方法(如 mjn 建议的那样),因为我发现它的连接开销很大。

我已经构建了一些在运行时使用普通 TADOConnection 的 Web 服务(流量相当低),并且发现建立数据库连接的开销可以忽略不计,当然与从设备到网络的整体网络延迟相比服务器并返回。
如果您发现 TADOConnection 在高流量环境中仍然会产生过多的开销,您可以轻松地将您自己的连接池添加到这样的系统中。

【讨论】:

  • 嗨,非常感谢有用的 cmets。自从写了这个问题以来,我已经做了各种测试,并且完全同意与网络调用本身的延迟相比,动态创建 SQL 连接的开销很小,我从现在开始采用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多