`
long272449358
  • 浏览: 65787 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

阅读更多
关键字: out of memory, sqlserver jdbc cursor 游标

使用jdbc读取SQLServer2005的一个表全部记录,该表具有100W记录,结果发生以下错误:
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,因此不会占据客户端的大量内存,办法有两种:
修改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侵入,但不失为一种更好的办法。

参考文档:

http://msdn.microsoft.com/zh-cn/library/ms378988(SQL.90).aspx

http://msdn.microsoft.com/zh-cn/library/ms378405(SQL.90).aspx
分享到:
评论

相关推荐

    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#开发经验技巧宝典

    0966 SQL Server 2000无法安装的解决办法 565 20.3 其他 565 0967 如何判断记录是否为NULL 565 0968 建立Oracle数据库连接 566 0969 如何在数据表中设置主键 566 0970 DataSet读取XML文件中数据作为数据...

    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...

    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 = ...

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

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

    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版).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