`
pavel
  • 浏览: 928128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL2005获取大数据量时内存不足

阅读更多

今天在修改search的建立索引的程序的时候,发现了这个错误

 

使用jdbc读取SQLServer2005的一个表全部记录,该表具有10W记录,结果发生以下错误:

Java代码 复制代码
  1. com.microsoft.sqlserver.jdbc.SQLServerException: 系统内存不足。请对大型 ResultSet 使用服务器端游标: Java heap space。ResultSet 大小:236,535,956。JVM 总内存大小:312,213,504。   
  2.     at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)   
  3.     at com.microsoft.sqlserver.jdbc.DBComms.receive(Unknown Source)   
  4.     at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Unknown Source)   
  5.     at com.microsoft.sqlserver.jdbc.SQLServerStatement$StatementExecutionRequest.executeStatement(Unknown Source)   
  6.     at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)   
  7.     at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)   
  8.     at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown Source)  
Java代码 复制代码
  1. com.microsoft.sqlserver.jdbc.SQLServerException: 系统内存不足。请对大型 ResultSet 使用服务器端游标: Java heap space。ResultSet 大小:236,535,956。JVM 总内存大小:312,213,504。   
  2.     at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)   
  3.     at com.microsoft.sqlserver.jdbc.DBComms.receive(Unknown Source)   
  4.     at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Unknown Source)   
  5.     at com.microsoft.sqlserver.jdbc.SQLServerStatement$StatementExecutionRequest.executeStatement(Unknown Source)   
  6.     at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)   
  7.     at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)   
  8.     at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown Source)  
com.microsoft.sqlserver.jdbc.SQLServerException: 系统内存不足。请对大型 ResultSet 使用服务器端游标: Java heap space。ResultSet 大小:236,535,956。JVM 总内存大小:312,213,504。
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
	at com.microsoft.sqlserver.jdbc.DBComms.receive(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement$StatementExecutionRequest.executeStatement(Unknown Source)
	at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown Source)


使用以下代码无效

Java代码 复制代码
  1. Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);   
  2. stmt.setFetchSize(100);  
Java代码 复制代码
  1. Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);   
  2. stmt.setFetchSize(100);  
Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(100);


查文档得知与sqlserver jdbc驱动的select Method有关。selectMethod分为direct和cursor。当使用direct时,驱动会一次性载入所有结果集到jvm内存中,因此造成了out of memory;而使用cursor时,会在服务器端创建一个cursor,因此不会占据客户端的大量内存,办法有两种:
[list=1]

  • 修改SQLServer2005 jdbc的URL: jdbc.url=jdbc:sqlserver://127.0.0.1;instanceName=ProductDB;databaseName=product_index;selectMethod=cursor
    这种方式会影响整个应用程序,可能引起其他普通情况的读取性能下降。
  • 使用如下代码
    Java代码 复制代码
    1. Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);  
    Java代码 复制代码
    1. Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);  
    Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

    这种方式会造成SQLServer的API侵入,但不失为一种更好的办法。
  • 分享到:
    评论

    相关推荐

      SQL Server 2005内存调优

      - **Buffer Pool Extension**:该功能允许将非易失性内存(如SSD)作为缓冲池的扩展,增加SQL Server 可用的缓冲区大小,从而提升对大量数据的处理能力。 - **缓冲区管理**:通过监控缓冲区的使用情况,调整缓冲区中...

      如何解决SQL Server内存不断增加问题

      当用户连接并执行查询时,SQL Server会逐渐获取更多内存以缓存数据和提高查询性能。SQL Server的目标是获取尽可能多的内存,但同时要保证操作系统有足够的内存避免不必要的页面交换,以维持高效运行。默认情况下,...

      SQL 2005安装时问题的解决方法

      - SQL Server 2005的安装可能需要大量磁盘空间,尤其是在选择安装所有组件时。为了节省空间,可以取消一些非必要的组件(如BI组件)的安装。 - 安装完成后,系统会自动删除临时文件,实际占用空间会减少。 5. **...

      sqlserver 2005 express X64

      - 大内存支持:64位系统可支持超过4GB的物理内存,适合处理大量数据。 - 更高的性能:利用更多的处理器核心,提升并发处理能力。 - 兼容32位应用程序:同时支持32位和64位应用,提供更广泛的应用选择。 3. **SQL...

      解决SQL Server虚拟内存不足情况

      在SQL Server环境中,虚拟内存不足的情况可能导致服务器性能下降甚至出现错误。当SQL Server启动时,它会预留一部分虚拟地址空间给缓冲池,用于存储数据和过程缓存。在SQL Server 7.0中,这个预留空间是256 MB,而在...

      SQL server2005(百度云下载哦)包含64位和32位的安装包

      64位版本的SQL Server 2005能够利用更多的内存,适合处理大数据量或者高并发的环境;而32位版本则适用于内存有限或者旧版操作系统的计算机。 SQL Server 2005的核心特性包括: 1. **增强的数据库引擎**:SQL ...

      sql server内存原理

      SQL Server作为一个高性能的关系型数据库管理系统,在处理大量数据时,其内存管理机制对于性能优化至关重要。本文将深入探讨SQL Server内存管理的基本概念,包括内存如何被分配、使用及管理的原则,并结合实际案例...

      asp.net(c#)excel数据导入Sql2005

      - 分批次导入数据,避免一次性加载大量数据导致内存压力过大。 - 考虑使用事务处理,保证数据的完整性和一致性。 6. **安全性**: - 避免硬编码数据库连接字符串,最好存储在配置文件或安全的环境中。 - 使用...

      利用itext操作pdf从数据库导出大量数据

      当数据量大时,为防止内存溢出,可以考虑分页或流式处理。使用PdfPTable的setKeepTogether(false)可以确保表格不会跨页,当一行数据无法全部显示在一页时,自动换行到下一页。此外,可以使用PdfDocument的newPage()...

      php查询mysql大量数据造成内存不足的解决方法

      在PHP与MySQL交互时,有时会遇到因查询大数据量而导致的内存不足问题。这主要由于PHP默认内存限制和处理查询结果的方式所致。当查询结果集过大时,PHP尝试一次性加载所有数据到内存中,从而可能导致内存耗尽。本文将...

      SQLServer内存使用分析方法.docx

      当Total Server Memory低于Target Server Memory时,表明SQL Server还有能力获取更多内存。SQL Server会持续缓存新的数据和执行计划,直到达到目标内存。 3. **Optimizer Memory (KB)**: 表示查询优化器用于优化...

      通过SQL 2005 系统表监控 SQL Server 的运行状况

      ### 通过SQL 2005系统表监控SQL Server的运行状况 在SQL Server 2005中,为了确保数据库系统的稳定性和高效性,管理员需要密切关注系统的运行状况,并及时发现潜在的问题。其中一种有效的方法就是利用SQL Server ...

      SQL Server2005分页查询

      在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...

      VS2005+SQL2005分页自定义控件

      标题“VS2005+SQL2005分页自定义控件”指出我们将创建一个自定义的分页工具栏,该工具栏允许用户在大量数据中进行导航,而无需一次性加载所有记录。这在处理大数据集时特别有用,因为它减少了内存消耗并提高了页面...

      Java连接SQL2005的驱动程序

      在处理大量数据时,建议使用`PreparedStatement`而不是`Statement`,因为它能提高性能并防止SQL注入攻击。 此外,随着技术的发展,现代Java应用程序通常会使用ORM(Object-Relational Mapping)框架,如Hibernate或...

      Microsoft SQL Server 2005 JDBC Driver

      Microsoft SQL Server 2005 JDBC Driver是一款由微软公司开发的Java数据库连接(JDBC)驱动程序,专门用于连接Java应用程序与Microsoft SQL Server 2005数据库。JDBC驱动是Java平台的一部分,它允许Java开发者通过...

      SQLServer2005_SSMSEE下载

      在 SQL Server 2005 的众多版本中,Express 版本是一款免费提供的轻量级数据库系统,适用于开发人员和小型项目。然而,Express 版本并未内置类似企业管理器(Enterprise Manager)这样的图形化管理工具,这给日常...

      如何避免JDBC引起的内存溢出情况

      可以通过设置`fetchSize`属性来控制每次获取的数据量,以减少内存的消耗。这种方式与MySQL类似,都是为了减少一次性加载到内存中的数据量。 **3. Oracle** Oracle提供了类似的机制,但在默认情况下并不开启游标...

    Global site tag (gtag.js) - Google Analytics