本帖最后由 huaxianpeng 于 2009-11-21 14:28:35 编辑

解决方案 »

  1.   

    ResultSet 大小:79,021,213。JVM 总内存大小:66,650,112。 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 
    这种方式会影响整个应用程序,可能引起其他普通情况的读取性能下降。 
       使用如下代码 Java代码 
    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侵入,但不失为一种更好的办法。 
      

  2.   

    up一楼!请教一下:可以解释一下什么是SQLServer的API侵入吗