我继承了一个使用 ADO 连接到 SQL Server 的旧版 Delphi 应用程序。
该应用程序有一个“全局连接”的概念——即它在开始时打开的单个连接,然后在应用程序的整个运行过程中保持打开状态(可能是几天、几周或更长时间...... )
所以我的问题是:我应该保持这种做事方式还是应该切换到“连接-查询-断开”的做事模式?有关系吗?
切换将是一项艰巨的任务,但如果这意味着更好的性能、数据管理等,我会这样做。
我继承了一个使用 ADO 连接到 SQL Server 的旧版 Delphi 应用程序。
该应用程序有一个“全局连接”的概念——即它在开始时打开的单个连接,然后在应用程序的整个运行过程中保持打开状态(可能是几天、几周或更长时间...... )
所以我的问题是:我应该保持这种做事方式还是应该切换到“连接-查询-断开”的做事模式?有关系吗?
切换将是一项艰巨的任务,但如果这意味着更好的性能、数据管理等,我会这样做。
嗯,这取决于你期望从中得到什么,以及它是什么类型的应用程序。
使用单个长时间运行的连接并没有什么特别的错误,只要应用程序可以优雅地处理断开连接并在无法重新连接时恢复或记录/通知。
连接-查询-断开连接设置的问题在于,您在每个查询上都增加了连接和断开连接的开销。这会减慢速度,并且在交互式 GUI 应用程序中,用户可能会注意到额外的开销。如果还没有授权,您还必须确保透明地处理授权。
同时,如果您可以将所有查询推送到后台线程并异步更新 GUI,则可能会获得交互式性能提升。如果由于查询被序列化而出现争用,您也可以相当容易地迁移到连接池系统并进一步改进事情。但是,这具有相当高的复杂性成本,因此现在您正在寻求平衡收益与所涉及的工作相比。
现在,我的最终反应是“如果它没有坏,就不要修复它。” 按照您的建议进行更改需要大量工作——这个应用程序的用户可以获得多少?是否还有其他问题需要解决,可能会使他们受益更多?
编辑:好的,所以它坏了。好吧,至少慢一点,这对我来说都是一样的。如果您已经排除了 SQL Server 本身的问题,并且查询的执行速度尽可能快(即 DB 架构是健全的,正确的索引可用,查询不是完全脑死,服务器有足够的 RAM 并且足够快I/O、网络不是不稳定的等等),那么是的,是时候想办法提高应用程序本身的性能了。
简单地转移到连接-查询-断开连接会使事情变得更糟,您发出的查询越多,下降的幅度就越大。听起来您将需要重新构建应用程序,以便您可以运行更少的查询,在后台运行它们,在客户端上更积极地缓存,或者所有 3 种的某种组合。
不要忘记使客户端性能更好意味着服务器端性能变得更加重要,因为如果客户端开始建立多个连接并并行发出多个查询,它可能会处理更高的负载。
正如弗雷泽先生之前所说的那样,一个全球性的联系本身并不坏。
如果你打算改变,首先检测出什么问题。让我们看一些场景:
某些屏幕(IOW:在业务实体中操作的一组 1..n 表单)速度很慢。可能的原因:
整个应用程序只会变慢。清单:
SELECT
内部事务。在读取提交隔离中,这只是开销,因为它会创建更多的网络流量。打开查询,检索数据并关闭数据集。WHERE
类似 :的查询WHERE SomeFunction(table1.blabla) = @SomeParam
。大多数时候,那些不会使用导致读取整个表以选择所需数据的索引。如果是一个大表……对持久计算列进行索引可以创造奇迹……[MSSQL HAT OFF]这就是我能想到的没有更多细节...... ;-)
创建数据库连接是耗时的资源,经验法则应尽可能少地创建并尽可能重用。这就是为什么其他一些技术具有数据库连接池的原因,这些连接池通常在应用程序/服务启动时建立,然后尽可能长时间地保持并在线程之间共享。
根据您的评论,该应用程序存在性能问题,但如果没有更多细节,很难提出任何建议。
应该尝试确定什么是慢的 - 所有查询都很慢还是只是一些特定的?如果只是一些特定的,则存在一些相关性。
我的 2 美分。