原作者: 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
分享到:
相关推荐
在64位(X64)系统上安装SQL Server 2005 Express,可以充分利用更大的内存和处理器资源,从而提高数据处理性能。下面我们将详细探讨SQL Server 2005 Express X64的特性、安装过程、使用场景以及相关知识点。 1. **...
6. **分析和报表**:SQL Server Analysis Services支持多维数据集和数据挖掘,而Reporting Services则提供了丰富的报表设计和分发功能,方便企业进行决策支持。 7. **Web服务和.NET集成**:SQL Server 2005与.NET ...
SQL Server 2005是基于.NET Framework 2.0构建的,提供了一整套全面的数据管理和分析解决方案。它支持多种数据库服务,包括数据库引擎、Analysis Services(数据分析服务)、Integration Services(数据集成服务)、...
Microsoft SQL Server 2005 JDBC Driver是一款由微软公司开发的Java数据库连接(JDBC)驱动程序,专门用于Java应用程序与Microsoft SQL Server 2005数据库之间的通信。这款驱动程序实现了Java Database Connectivity...
Microsoft SQL Server 2005 Express Edition SQL Server 文档小组无法回答技术支持问题,但是欢迎您对本自述文档提出建议和意见。您可以使用提供的链接快速、直接地发送电子邮件反馈。请使用英语发送您的反馈信息...
在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...
4. **内存压力**:当内存不足时,SQL Server会使用“内存压力”机制,通过淘汰缓存页来释放内存。监视“内存压力”有助于发现可能的性能瓶颈。 二、IO性能监控 1. **磁盘I/O监控**:使用`sys.dm_io_virtual_file_...
在C++编程中,与SQL Server数据库交互是常见的任务,特别是在开发桌面应用程序时。要实现这一功能,开发者通常会利用数据库API或者ODBC(Open Database Connectivity)等接口。本篇文章将详细探讨如何在C++中使用...
3. 处理结果集:对于查询操作,可以遍历`ResultSet`来获取数据。 **关闭资源** 记得在完成数据库操作后关闭所有打开的资源,以释放系统资源,防止内存泄漏。 ```java finally { if (rs != null) { rs.close(); }...
2. 数据源控件缓存:SQLDataSource控件支持数据集缓存,可以在数据查询后将其保存在服务器内存中,下次请求相同数据时直接返回缓存的结果,而不重新执行查询。这需要在控件的配置中设置`CacheDuration`属性来指定...
在SQL Server 2005中,数据库级别的异步分页是一种提高大型数据集查询效率的技术,它允许应用程序以非阻塞方式获取数据,从而提高用户体验。这种技术结合了存储过程、JavaScript以及数据库的内部机制,以实现高效、...
4. **处理结果集**:对于查询语句,执行后返回ResultSet对象,通过迭代遍历结果集,获取数据。 5. **关闭资源**:使用完连接、Statement和ResultSet后,务必关闭以释放资源,防止内存泄漏。 6. **异常处理**:在每...
SQL Server 2005 JDBC 是微软公司提供的一种用于Java应用程序与SQL Server 2005之间进行数据交互的驱动程序。JDBC(Java Database Connectivity)是Java平台中用于访问数据库的标准API,它允许Java开发者在Java代码...
- **SQL Server 2005 Workgroup Edition**:面向小型企业的解决方案,提供了基本的数据管理和存储功能。 - **SQL Server 2005 Developer Edition**:专为开发人员设计,具有与 Enterprise Edition 相同的功能集,但...
通过使用SQL Server Profiler跟踪性能数据,System Monitor监控系统指标,以及动态管理视图获取实时数据库状态信息,可以定位问题所在。 **Resource Bottlenecks** 资源瓶颈部分详细讨论了CPU、内存和I/O可能出现的...
《SQL Server 2005性能调优》是针对数据库管理员和开发人员的重要参考资料,尤其在处理大型系统时,性能优化是确保系统高效运行的关键环节。SQL Server 2005作为微软公司的一款强大数据库管理系统,其性能调优涉及到...
3. Sql Server 2005:这是一个关系型数据库管理系统,提供数据存储、查询和管理功能,支持高效的分页查询。 二、分页实现步骤 1. 数据库设计与准备: - 设计一个包含多行数据的表。 - 在Sql Server 2005中创建并...
SQLServer 性能仪表盘(Performance Dashboard Reports)是SQL Server管理工具中的一种强大特性,它为数据库管理员提供了直观且详尽的性能监控解决方案。通过这些报告,DBAs能够快速识别和解决性能瓶颈,优化数据库...