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
Post a Comment