1

我正在使用 SQL Server 2008 在 Windows Server 2008 上运行服务器应用程序,现在我的场景与给定的一样。

  1. 我已经实现了一个自定义的连接池(为什么我这样做是另一个长篇故事)。因此我不会在每个请求上打开或关闭连接。

  2. 服务器应用程序使用池中可用的 10 个连接在一分钟内执行数千个 DBCommand。

  3. 执行命令后,我没有清理连接(因为我不知道要清理什么以及如何在不关闭和重新打开它的情况下清理),而且我也没有处理命令对象本身。

  4. 当服务器应用程序关闭时,它会通过调用它们的 close 方法释放所有连接。

现在我观察到在 sqlserver 的 1 小时或 2 个进程的测试后大约 3Gig 内存,然后我关闭了我的服务器应用程序,即使占用的内存没有释放或减少(根据任务管理器和资源监视器),我重新启动后sqlserver 释放内存。

现在以下是我的问题。

  1. 我是否需要每次都调用 DBCommand 对象的 Dispose,如果是,那么它会对连接对象产生影响。

  2. 上面提到的问题是导致我观察到的还是还有其他原因。

  3. 有什么方法可以在不关闭连接的情况下清理连接,以及每次执行 DbCommand 后需要清理什么样的垃圾。

谢谢穆巴沙尔

4

4 回答 4

2

然后我关闭了我的服务器应用程序,即使占用的内存没有释放或减少(根据任务管理器和资源监视器)[...]

由于关闭应用程序会释放所有对象,因此这一观察清楚地表明,内存丢失问题不是由未释放的对象引起的。(尽管如此,正如 David 正确指出的那样,始终处置 IDisposables 是一种很好的做法。)

因此,您应该查看 SQL Server 的内存配置。请注意,如果内存可用,使用该内存的 SQL Server 是一件好事。未使用的内存是浪费钱。通常,一旦其他进程需要,SQL Server 就会释放内存:

当 SQL Server 动态使用内存时,它会定期查询系统以确定可用的空闲物理内存量。SQL Server 会根据服务器活动增大或缩小缓冲区高速缓存以将可用物理内存保持在 4 MB 和 10 MB 之间。这可以防止 Microsoft Windows NT® 4.0 或 Windows® 2000 分页。如果可用内存较少,SQL Server 会向 Windows NT 4.0 或 Windows 2000 释放通常在可用列表中的内存。如果有更多可用内存,SQL Server 会将内存重新提交到缓冲区高速缓存。SQL Server 仅在其工作负载需要更多内存时才向缓冲区缓存添加内存;静止的服务器不会增长其缓冲区缓存。

因此,除非您的服务器开始过度交换,否则我不会太担心 SQL Server 内存消耗。

于 2010-01-21T09:14:19.930 回答
1

SQL Server 将使用大量内存并且在必要时才将其归还,因此您应该始终在专用机器上运行 SQL。如果您必须在共享环境中使用它,您可以配置最大内存限制,但您的应用程序不会导致 SQL 释放内存。

于 2010-01-21T08:51:01.470 回答
1
  1. 总是Dispose() IDispose能。

  2. 不知道。

  3. 在将连接返回到池之前,使用sp_reset_connection重置连接。

于 2010-01-21T08:56:05.940 回答
0

连接池受到控制,并将参数传递给连接字符串,该字符串基本上包括以下内容:

· 连接超时

· 最小池大小

· 最大池大小

· 池化

如果您看到您的应用程序在很短的时间内生成了大量的连接,那么您首先检查您的应用程序是否有打开的连接,并确保在完成处理后立即关闭它们。关闭的连接实际上不会关闭,并且可供服务器的另一个请求使用。特别检查您的 DataReader 对象并在它们脱离上下文时立即关闭它们。有时,开发人员在嵌套循环中使用多个 DataReader 并在 finally 子句中关闭所有 DataReader。不要这样做,一旦退出循环就尝试停止 DataReader。是的,您可以随时在 finally 子句中再次检查 DataReader 对象的状态,如果没有关闭,您可以关闭它。

现在检查将 ConnectTimeout 调整到最小,比如 1 秒。这将设置应用程序关闭的池中连接的生命周期,并将 MaxPoolSize 设置为服务器的最大限制。我猜,如果没有其他应用程序连接到同一个服务器数据库,它将是 100。将 MinPoolSize 值设置为 5,因为您会将 ConnectTimeOut 设置为最小值,在这种情况下,连接池要有效地工作,您需要一些始终可用的连接。

尝试这些设置和更改。希望这会让您满意。

谢谢,

拉吉夫·兰詹·拉尔

于 2010-01-21T09:14:11.793 回答