背景
我们在连接到单个数据库服务器的不同 Web 服务器上拥有许多 Web 应用程序。在过去的几个月里,我们注意到每隔一段时间,我们的 Web 服务器将无法连接到数据库服务器。
我们的环境
我们有几个不同的 Web 环境,一些运行 ColdFusion,另一些运行 .NET。.NET 应用程序既是 Web 窗体又是 MVC。它们跨越从 2.0 到 4.5 的多个版本。ColdFusion 和 .NET Web 服务器都是基于 Windows 的机器。ColdFusion 和 .NET Web 环境都是集群的,一些机器是物理的,而另一些是虚拟的。
我们的数据库服务器是 SQL Server 2008 r2。它包含多个数据库。每个应用程序都有自己的数据库用户,它连接到只允许它访问特定数据库的服务器。
其他事实
- 当我们注意到问题时,它们会以短时间的形式出现,持续时间从几秒钟到几分钟不等。
- 当我们注意到问题时,突发包含来自多个不同应用程序的错误,而不仅仅是一个应用程序。
- 当我们注意到问题时,突发包含来自不同 Web 环境的应用程序的错误。(这让我们认为我们可以排除应用程序本身的问题)
- 连接问题的爆发发生在白天和晚上的不同时间。它们并不总是在高使用率期间。
- 我们已经监控了诸如用户连接数、内存、IO、CPU 使用率等内容......我们没有看到峰值或任何其他可能指向问题的东西。
- 我们已经在 web 和 db 服务器上安装了 wireshark,希望能在没有任何成功的情况下解决问题。
问题
- 有人对我接下来应该去哪里有建议吗?
- 是否存在可能导致此问题的数据库属性?
- 有没有办法以更好的方式“监控”数据库和 Web 服务器之间的连接?
- 应用程序端有什么可以做的以更好地了解正在发生的事情吗?
应用程序捕获的错误
- .NET 错误
- 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)
- 超时已过。在操作完成之前超时时间已过或服务器没有响应。
- 从服务器接收结果时发生传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过。)
- 超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。
- ColdFusion 错误
- 执行数据库查询时出错。与主机的 TCP/IP 连接失败。java.net.ConnectException: Connection timed out: connect
第38行出现错误。 - 执行数据库查询时出错。Connection reset by peer: socket write error
错误发生在第 91 行。 - 执行数据库查询时出错。尝试建立连接超时
错误发生在第 38 行。
- 执行数据库查询时出错。与主机的 TCP/IP 连接失败。java.net.ConnectException: Connection timed out: connect