今天在修改search的建立索引的程序的時候,發(fā)現(xiàn)了這個錯誤
?
使用jdbc讀取SQLServer2005的一個表全部記錄,該表具有10W記錄,結(jié)果發(fā)生以下錯誤:
- com.microsoft.sqlserver.jdbc.SQLServerException:?系統(tǒng)內(nèi)存不足。請對大型? ResultSet ?使用服務(wù)器端游標(biāo):? Java ? heap ? space。ResultSet ?大小: 236 , 535 , 956 。JVM?總內(nèi)存大小: 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)??
- com.microsoft.sqlserver.jdbc.SQLServerException:?系統(tǒng)內(nèi)存不足。請對大型? ResultSet ?使用服務(wù)器端游標(biāo):? Java ? heap ? space。ResultSet ?大小: 236 , 535 , 956 。JVM?總內(nèi)存大小: 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)??
com.microsoft.sqlserver.jdbc.SQLServerException: 系統(tǒng)內(nèi)存不足。請對大型 ResultSet 使用服務(wù)器端游標(biāo): Java heap space。ResultSet 大小:236,535,956。JVM 總內(nèi)存大小: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 );??
- Statement?stmt?=?con.createStatement( ResultSet .TYPE_FORWARD_ONLY, ResultSet .CONCUR_READ_ONLY); ??
- stmt.setFetchSize( 100 );??
Statement stmt = con.createStatement( ResultSet .TYPE_FORWARD_ONLY, ResultSet .CONCUR_READ_ONLY); stmt.setFetchSize(100);
查文檔得知與sqlserver jdbc驅(qū)動的select Method有關(guān)。selectMethod分為direct和cursor。當(dāng)使用direct時,驅(qū)動會一次性載入所有結(jié)果集到j(luò)vm內(nèi)存中,因此造成了out of memory;而使用cursor時,會在服務(wù)器端創(chuàng)建一個cursor,因此不會占據(jù)客戶端的大量內(nèi)存,辦法有兩種:
[list=1]
這種方式會影響整個應(yīng)用程序,可能引起其他普通情況的讀取性能下降。
- 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);??
Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY,
ResultSet
.CONCUR_READ_ONLY);
這種方式會造成SQLServer的API侵入,但不失為一種更好的辦法。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
