`
pavel
  • 浏览: 918494 次
  • 性别: 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虚拟内存不足情况

      SQL Server 虚拟内存不足是指在 SQL Server 启动过程中,服务器保留剩下的所有虚拟地址空间以供缓冲池使用,导致其他分配无法获取足够的虚拟内存。这种情况可能会导致服务器性能下降,影响数据库的稳定运行。 解决...

      Microsoft SQL Server 2005 Express Edition SP3

      与 Microsoft Visual Studio 2005 集成之后,SQL Server Express 可以轻松的开发功能强大且安全的数据驱动应用程序,并允许快速部署这些应用程序。SQL Server Express 可以根据协议重新进行发布,并可作为客户端...

      完美解决因数据库一次查询数据量过大导致的内存溢出问题

      今天小编就为大家分享一篇完美解决因数据库一次查询数据量过大导致的内存溢出问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

      邹建大大笔记-sqlserver2000.rar

      邹建-中文版SQL Server2000开发与管理应用实例 一书的目录,可以对照一下 第 1 章 安装和配置SQL Server 1 1.1 SQL Server的版本和版本选择 1 1.2 安装SQL Server的常见问题 3 1.3 如何理解实例 5 ...

      SQL SERVER 2000开发与管理应用实例

      本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关...

      SQL培训第一期

      结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行的信息查询,select。 ...

      PL/SQL Developer8.04官网程序_keygen_汉化

      无论PL/SQL程序段的代码量有多大,其基本结构就是由这三部分组成。  如下所示为一段完整的PL/SQL块:  /*声明部分,以declare开头*/  declare v_id integer;v_name varchar(20);  cursor c_emp is select * from...

      什么是NoSQL数据库?

      由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作,处理起来也更加容易。同理,数据的读入操作当然也同样容易。 提升性能和增大规模 下面说一点题外话,如果想要使...

      Java基于SSM(Spring+SpringMVC+MyBatis)数据结构课堂考勤管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)树品种资源数据管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)数据结构课堂学生考勤管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      ASP EXCEL导入SQL

       所有的请求都是统一通过RESTAPI进行相应的资源与服务的请求,这样就能够保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性,同时也能够根据业务进行相应统一且透明的内存缓存 ...

      Java基于SSM(Spring+SpringMVC+MyBatis)大学生兼职平台.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)大学生奖助学金发放管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)家政预约管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)新疆旅游管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)大美新疆在线论坛交流系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)个人健康信息管理系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

      Java基于SSM(Spring+SpringMVC+MyBatis)在线汽车交易系统.zip

      也就是说,可以将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型。内存中的数据模型可以是任意数据结构或对象模型,存储数据的类型可以是XML,二进制流,关系模型等 ORM:在持久化对象上...

    Global site tag (gtag.js) - Google Analytics