问题描述
某个代理需要从db2数据库读取数据然后输出在当前doc,这个代理运行前几次不会报错,多次运行后会报如下错误。2009-10-1016:53:12HTTPJVM:JVMDG315:JVMRequestingHeapdumpfile2009-10-1016:53:12HTTPJVM:JVMDG318:HeapdumpfilewrittentoD:LotusDominoheapdump.20091010.165312.6084.phd2009-10-1016:53:12HTTPJVM:JVMDG274:DumpHandlerhasProcessedOutOfMemory.2009-10-1016:53:12HTTPJVM:JVMST109:InsufficientspaceinJavaheaptosatisfyallocationrequest2009-10-1016:53:12HTTPJVM:Exception2009-10-1016:53:12HTTPJVM:inthread2009-10-1016:53:12HTTPJVM:"Thread-14"2009-10-1016:53:12HTTPJVM:2009-10-1016:53:12HTTPJVM:java.lang.OutOfMemoryError:JVMCI008:OutOfMemoryError,eeGetFromJNIEnvfailed2009-10-1016:53:12JVM:Creationofthebyte[]objectfailed.2009-10-1016:53:12HTTPWebServer:LotusNotesException-JVM:AttempttoretrieveJavaagentattachmentsfailed.[/testoa/wjdd.nsf/MarqueeUp?OpenForm]
解决方案
解决方案二:
importlotus.domino.*;importjava.sql.*;importjava.util.Vector;importjava.security.*;importcom.ibm.db2.jcc.*;importjava.lang.*;publicclassJavaAgentextendsAgentBase{publicvoidNotesMain(){System.out.println("Agentdb2JAVA_PrintLinkisrunning");Sessionsession=null;AgentContextagentContext=null;Databasedb=null;Documentdoc=null;Stringdbpath=null;Stringsql=null;Stringurl=null;Stringuser=null;Stringpassword=null;Stringdbname=null;Stringservername=null;Stringport=null;Stringdb2Name=null;Stringtable=null;inti=1;intj=21;StringtmpHTML="";StringtmpTitle=null;StringtmpDate=null;StringtmpUrl=null;Connectionconn=null;Statementstmt=null;ResultSetrs=null;try{//与关系数据库建立连接servername="10.10.10.10";//地址port="50000";//端口db2Name="testDb2";//库名user="db2admin";//用户名password="DB2ADMIN";//口令url="jdbc:db2://"+servername+":"+port+"/"+db2Name;//完整链接Class.forName("com.ibm.db2.jcc.DB2Driver");//System.out.println("建立与DB2的链接----------------------1");conn=DriverManager.getConnection(url,user,password);//System.out.println("建立与DB2的链接----------------------2");stmt=conn.createStatement();//System.out.println("建立与DB2的链接----------------------3");table="DF_T_NEWS";session=getSession();agentContext=session.getAgentContext();db=agentContext.getCurrentDatabase();doc=agentContext.getDocumentContext();//抽取db2数据sql="select*from"+table+"ORDERBYTIMEDESC";rs=stmt.executeQuery(sql);//previous()absolute()first()next()if(rs!=null){while(rs.next()){//读取数据tmpTitle=rs.getString("TITLE");tmpDate=rs.getString("TIME");tmpUrl=rs.getString("HREF");//tmpHTML=tmpHTML+"<divstyle='line-height:24px;height:24px;font-size:12px;'>"+tmpDate+"<ahref='"+tmpUrl+"'target='_blank'>"+tmpTitle+"</a>";tmpHTML=tmpHTML+"<divstyle='line-height:24px;height:24px;font-size:12px;'><ahref='#'onclick=resizeNewWindow('"+tmpUrl+"')>"+tmpTitle+"</a>";tmpHTML=tmpHTML+"</div>";//移动游标循环增量i++;tmpTitle="";tmpDate="";tmpUrl="";if(i>=j)break;}rs.close();}//endif//★添加抽取的数据至doc对象doc.replaceItemValue("ReturnHTML",tmpHTML);//回收所有db2对象if(stmt!=null){stmt.close();stmt=null;}if(conn!=null){conn.close();conn=null;}if(rs!=null){rs.close();rs=null;}//回收所有notes对象if(doc!=null){doc.recycle();System.out.println("recycledoc");doc=null;}if(db!=null){db.recycle();System.out.println("recycledb");db=null;}if(agentContext!=null){agentContext.recycle();System.out.println("recycleagentContext");agentContext=null;}if(session!=null){session.recycle();System.out.println("recyclesession");session=null;}dbpath=null;sql=null;url=null;user=null;password=null;dbname=null;servername=null;port=null;db2Name=null;table=null;tmpHTML=null;tmpTitle=null;tmpDate=null;tmpUrl=null;System.gc();}catch(Exceptione){System.out.println("Error...");System.out.println("第"+i+"条文档参数出错");System.out.println("出错的db2语句:="+sql);e.printStackTrace();}finally{try{//变量回收db2对象if(stmt!=null){stmt.close();stmt=null;}if(conn!=null){conn.close();conn=null;}if(rs!=null){rs.close();rs=null;}//回收所有notes对象if(doc!=null){doc.recycle();System.out.println("recycledocinfinally");doc=null;}if(db!=null){db.recycle();System.out.println("recycledbinfinally");db=null;}if(agentContext!=null){agentContext.recycle();System.out.println("recycleagentContextinfinally");agentContext=null;}dbname=null;sql=null;url=null;user=null;password=null;dbpath=null;if(session!=null){session.recycle();System.out.println("recyclesessioninfinally");session=null;}System.gc();}catch(Exceptione){System.out.println(e.getMessage());}System.out.println("Agentdb2JAVA_PrintLinkhasbeenclosed");}}}这是我代理的全部代码,有没有高人知道问题具体出在哪??????
解决方案三:
搞定了没有啊,看错误好像是内存溢出,看你代码都recycle()了,,,
解决方案四:
/**参考:http://blog.csdn.net/ygxxingxing/archive/2007/11/16/1888945.aspx个人感觉:1.你的search会返回大数据量数据,所以有可能会超过默认的64兆JVM内存,可以试着调高JVM内存;2.tmpHTML是String类型,在循环中用+=赋值会很耗资源,建议改为StringBuffer**/