servlets - java.lang.OutOfMemoryError: -



servlets - java.lang.OutOfMemoryError: -

i'm trying create video files bytes retrieved database. programme worked before few hours. after uploading big file, when seek retrieve it, producing error java.lang.outofmemoryerror:

my code is:

conn = prepareconnection(); stringbuilder sb=new stringbuilder(1024); sb.append("select videoname,videoid,videofull ").append(uname.trim()).append("video"); string sql=sb.tostring(); stmt = conn.preparestatement(sql); resultset rs = stmt.executequery(); while(rs.next()){ byte[] videodata = rs.getbytes("videofull"); //#57 int vid=rs.getint("videoid"); stringbuilder sb1 = new stringbuilder(); sb1.append(vid); string videoid=sb1.tostring(); string vname=rs.getstring("videoname"); file file=new file("c:/users/jamespj/documents/skypark/skypark/webcontent/sp/resources/videos/"+vname+""+videoid+".mp4"); if(file.exists() && !file.isdirectory()){ continue; } else { fileoutputstream output = new fileoutputstream(file); ioutils.write(videodata, output); output.close(); } } request.setattribute("uname", uname); requestdispatcher dispatcher = request.getrequestdispatcher("/videolist"); if(dispatcher != null) { dispatcher.forward(request, response); }

console output is:

exception in thread "http-bio-8080-exec-3" java.lang.outofmemoryerror: java heap space @ oracle.sql.blob.getbytes(blob.java:217) @ oracle.jdbc.driver.t4cblobaccessor.getbytes(t4cblobaccessor.java:462) @ oracle.jdbc.driver.oracleresultsetimpl.getbytes(oracleresultsetimpl.java:716) @ oracle.jdbc.driver.oracleresultset.getbytes(oracleresultset.java:402) @ skypark.videofilecreator.doget(videofilecreator.java:57) @ javax.servlet.http.httpservlet.service(httpservlet.java:621) @ javax.servlet.http.httpservlet.service(httpservlet.java:728) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ org.apache.catalina.core.applicationdispatcher.invoke(applicationdispatcher.java:749) @ org.apache.catalina.core.applicationdispatcher.processrequest(applicationdispatcher.java:487) @ org.apache.catalina.core.applicationdispatcher.doforward(applicationdispatcher.java:412) @ org.apache.catalina.core.applicationdispatcher.forward(applicationdispatcher.java:339) @ skypark.videostream.processrequest(videostream.java:48) @ skypark.videostream.doget(videostream.java:64) @ javax.servlet.http.httpservlet.service(httpservlet.java:621) @ javax.servlet.http.httpservlet.service(httpservlet.java:728) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:222) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:123) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:171) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:99) @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:931) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:407) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1004) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:589) @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:310) @ java.util.concurrent.threadpoolexecutor.runworker(unknown source) @ java.util.concurrent.threadpoolexecutor$worker.run(unknown source)

please tell me error tells. need right in it.......thanks.....

here,

byte[] videodata = rs.getbytes("videofull");

you're storing entire file contents in server's memory. know, 1 byte of byte[] eats 1 byte of java's memory. if you've e.g. 500mb memory , file on 500mb, you'll error. note when 10 users concurrently request video file of 50mb. increasing java memory suggested other answers temporary solution , not thought out.

you need obtain in flavor of inputstream instead internally allocate few (kilo)bytes streaming buffer in memory instead of entire file contents.

inputstream videodata = rs.getbinarystream("videofull");

and write desired output stream using ioutils#copy() instead (don't forget close them in finally!).

fileoutputstream output = new fileoutputstream(file); seek { ioutils.copy(videodata, output); } { ioutils.closequietly(output); ioutils.closequietly(videodata); }

java servlets jdbc

Comments

Popular posts from this blog

web services - java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer -

Accessing MATLAB's unicode strings from C -

javascript - mongodb won't find my schema method in nested container -