4

当从 Windows XP 客户端使用 Windows 身份验证时,我们的 MS Access 应用程序与 SQL Server 2005 的链接表很慢。

我们一直在使用 SQL Server 身份验证成功运行它,但现在我们想要迁移到 Windows 身份验证以获得更好的安全控制。

设置:

  • 数据库服务器:Windows 2003 Server、SQL Server 2005 SP2
  • 客户端:Windows XP SP3,SQL Server ODBC 驱动程序 v2000.85.1132.00
  • MS Access 应用程序:MS Access 2003
  • 连接字符串:
    DRIVER=SQL Server;SERVER=[server name];Connect Timeout=300;Trusted Connection=True;APP=Microsoft Office 2003;WSID=[server name];DATABASE=[db name]
  • 服务器上仅启用 TCP/IP 网络协议。

在这些情况下不会发生缓慢:

  • 数据库服务器上的应用程序,SQL Server 身份验证
  • 数据库服务器上的应用程序,Windows 身份验证
  • Windows XP 客户端上的应用程序,SQL Server 身份验证
  • 客户端上的 SQL Server Management Studio,Windows 身份验证 - 我做了一个小测试,在 SQL MS 中运行了 15 个查询。这进展很快,并且没有在服务器上的安全事件日志中导致任何登录/注销事件。

我已经使用 SQL Server Profiler 和服务器上的事件日志分析了缓慢,它似乎归结为:

  1. 应用程序运行查询
  2. 与 SQL Server 的新连接已打开(在 SQL Server Profiler 中可见)
  3. 验证用户的身份(在服务器上的安全事件日志中可见,发生登录/注销事件)。这需要数百毫秒。
  4. 查询在 SQL Server 上运行
  5. 结果返回到 Access

每个查询都会发生这种情况。某些表单在显示新记录时会运行 +- 10 次查询(更新子表单、加载组合的值等)。这会导致性能非常缓慢。

当然,不必为每个查询都建立与 SQL Server 的新连接,重用连接可能会解决问题。我一直在寻找有关如何确保 Access/ODBC 进行正确连接池的信息。我找到了这些 MS 知识库文章:

关于 ODBC 连接池的常见问题解答
如何在 ODBC 应用程序中启用连接池

我尝试从 Access 应用程序的主窗体中调用 SQLSetEnvAttr 函数,但这并没有改善结果。

任何帮助是极大的赞赏。

4

2 回答 2

3

我的第一个问题是:你在运行域控制器吗?这听起来像是一个疯狂的问题,但我只是想确定一下。尽管越来越少见,但我已经看到组织使用工作组和“直通”身份验证运行 Windows 网络。您描述的症状与在以这种方式设置的网络上观察到的症状相同。

假设您确实设置了正确的域,那么您一定在 Named Pipes 网络堆栈中的某个地方遇到了问题。如果您使用 Windows 身份验证,命名管道是默认协议。如果您有时间,深入了解这一点并不是一个坏主意,但是如果您只想解决性能问题,那么我会在您的连接字符串中强制使用 TCP/IP 协议:

DRIVER=SQL Server;SERVER=tcp:[server name];Connect Timeout=300;Trusted Connection=True;APP=Microsoft Office 2003;WSID=[server name];DATABASE=[db name]

注意添加了 tcp: 前缀。我从Jon Galloway 的博客中得到了这个语法。 TCP/IP 是 SQL Server 身份验证的默认协议。您还可以通过禁用服务器上的命名管道支持来进行协议切换,但这更麻烦,并且可能导致其他意想不到的问题。

于 2009-10-27T05:45:02.353 回答
0

在http://www.microsoft.com/downloads/details.aspx?FamilyID=d09c1d60-a13c-4479-9b91-9e8b9d835cdc&displaylang=en检查 Microsoft SQL Server Native Client

于 2009-08-17T02:01:08.360 回答