2013-11-21 68 views
0

内存问题我有一个做以下一些java代码:与ResultSet和SQL Server 2012中

Statement stmt = GetMsSqlConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY, 
               ResultSet.CONCUR_READ_ONLY); 
ResultSet rs = stmt.executeQuery("SELECT * FROM Table WHERE ID=1"); 
//do stuff with recordset 
rs.close(); 
stmt.close(); 

这是一个循环,我会通过对表不同的ID的一部分。问题是,虽然这是循环,我看到我的SQL Server进程的内存在每次迭代增长。当我遍历我的代码时,我注意到导致该问题的行是在executeQuery调用中。我不惊讶这导致了一些增加的RAM使用,但我会认为rs.close和stmt.close会释放我的SQL Server上的资源。有没有更好的处理这个或我的环境中的东西我需要看看以确保我在下一次迭代之前释放所有资源?

+1

服务器很可能直到达到某个阈值,以推迟清理。垃圾收集非常昂贵,因此每次释放资源时都不会执行垃圾收集。如果你运行数千个这样的服务器,内存增长没有限制?我敢打赌它达到了一些门槛,然后下降。 –

+0

这是一个可以运行10万次以上的循环,在这种情况下,内存似乎达到了2900 MB左右的上限。我正在使用12 GB RAM的机器,我主要关心的是程序能够在<4 GB RAM的计算机上运行。上限是否与可用RAM的数量成比例? – gdawgrancid

+0

我知道特别是关于MSSQL的零点,但是我使用的每个其他数据库都有旋钮(参数)来设置内存使用限制。 –

回答

1

服务器只是缓存最近访问过的页面。如果允许,MSSQL将使用系统中可用的所有内存。这不是内存泄漏,并且MSSQL不会耗尽内存,它只会开始从缓存中逐出最少使用的页面。

0

服务器很可能推迟清理,直到达到某个阈值。垃圾收集非常昂贵,因此每次释放资源时都不会执行垃圾收集。如果您连续运行数千个这样的内存,服务器内存使用情况的图形可能会显示锯齿图案,其中内存线性增加,然后在GC发生时下降,并反复重复。

所有的数据库服务器都有参数来调整它们运行的​​硬件的内存使用情况。

2

我在阅读结果集时遇到内存不足的问题。很多当前的论坛都将重定向到使用游标和获取大小。但是,当我添加光标和提取大小选项时,OOM问题未解决。相反,我们观察到多线程尝试读取结果集并发送数据时存在死锁。 此外,我没有注意到在存储器消耗不断变化的读取大小和增加光标的任何变化: 提取大小光标MemoryConsumed(MB) 1 OFF 209 OFF OFF 151 OFF ON 132 OFF OFF 160

工作时解决这些问题,我正好降落在它提供了解析只读结果集是更好的选择一个博客 - ResponseBuffering =自适应选项

http://blogs.msdn.com/b/jdbcteam/archive/2007/05/02/what-is-adaptive-response-buffering-and-why-should-i-use-it.aspx

http://technet.microsoft.com/en-us/library/bb879937(v=sql.110).aspx

MSDN建议建议不要为'只读大数据集使用'selectMethod'='游标',更好的选择是使用'responseBuffering'='adaptive'。

使用'responseBuffering'='adaptive'我们能够摆脱两个问题: 1.内存不足问题已解决 2.没有死锁。 使用最简单的代码,数据传输2000000条记录与5个来源失败。通过添加自适应响应缓冲,每个源有40个源的2000000条记录传输没有任何问题。但是,这并不意味着有超过40个来源转移失败。

对于大型的只读结果集,设置响应缓冲作为自适应是最好的选择。

这里是我的详细博客的链接: http://pallavikaranjkar.blogspot.in/2014/10/context-existing-system-sends-data-from.html