`
fyting
  • 浏览: 215616 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SQLServer2005获取大数据集时内存不足的解决办法

    博客分类:
  • Java
阅读更多
原作者: fyting,转载请注明原文地址: http://fyting.iteye.com/blog/166988

使用jdbc读取SQLServer2005的一个表全部记录,该表具有10W记录,结果发生以下错误:
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)

使用以下代码无效
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

  • 这种方式会影响整个应用程序,可能引起其他普通情况的读取性能下降。
  • 使用如下代码
  • Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

    这种方式会造成SQLServer的API侵入,但不失为一种更好的办法。
    [/list]
    参考文档:
    http://msdn2.microsoft.com/en-us/library/ms378405.aspx
    http://msdn2.microsoft.com/en-us/library/ms378988.aspx
    2
    2
    分享到:
    评论

    相关推荐

      Microsoft SQL Server 2005 Express Edition SP3

      Microsoft SQL Server 2005 Express Edition SQL Server 文档小组无法回答技术支持问题,但是欢迎您对本自述文档提出建议和意见。您可以使用提供的链接快速、直接地发送电子邮件反馈。请使用英语发送您的反馈信息...

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

      涉及安装和配置SQL Server、日期处理、字符处理、排序规则、编号处理、数据统计与汇总、分页处理、树形数据处理、数据导入与导出、作业、数据备份与还原、用户定义数据类型、数据库安全、系统表应用实例、SQL Server...

      粗糙集(Rough Set)约简系统软件

      现有的大部分数据库系统例如SQL Server等都具有存取效率高、存储空间的利用率高、适合大规模的数据的存储等优点,因此我们采用SQL语言实现粗糙集的集合操作,选用高性能的数据库管理系统实现粗糙集的数据挖掘,这样...

      C#开发经验技巧宝典

      0973 通用方法获取查询结果DataSet数据集 568 0974 同时查询多条SQL语句 568 0975 如何判断是否查询到结果 568 0976 将图片以二进制格式存储到数据库中(asp.net) 569 0977 从DataReader对象读取数据的...

      Devart_SQL_Server_Data_Access_Components_SDAC_for_Delphi_8.0.2_D6-XE10.2

      由FlatBuffers数据集选项控制 在CachedUpdates模式下支持blob字段 2.05 09-Aug-02 DBMonitor支持 2.00 18-Jul-02 支持服务器游标 支持多个结果集的查询 性能提升 打开查询而不支持将所有行提取到客户端(FetchAll = ...

      asp.net知识库

      ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署 ASP.NET 2.0 Security FAQs Asp.net 2.0功能体验,细节之Web控件(一) 隐藏控件 Asp.net 2.0功能体验,总体设计思想 Asp.net 2.0 WebPart使用经验点滴 革新:.NET...

      Android开发资料合集--续

      7、通过HttpClient从指定server获取数据 13 8、隐藏小键盘 13 9、响应Touch 15 10、Activity间的通信 15 1、Bundle传值 15 2、利用startActivityForResult与onActivityResult方法 16 11、使程序完全退出 18 12、列出...

      C#程序开发范例宝典(第2版).part13

      实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统...

      C#程序开发范例宝典(第2版).part08

      实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统...

      C#程序开发范例宝典(第2版).part02

      实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统...

      C#程序开发范例宝典(第2版).part12

      实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统...

    Global site tag (gtag.js) - Google Analytics