从「;“堆内存”;至;java.sql.SQLException:结果集关闭后不允许操作";

从「;“堆内存”;至;java.sql.SQLException:结果集关闭后不允许操作";,java,mysql,jsp,tomcat,Java,Mysql,Jsp,Tomcat,我有一个小网站,从mysql数据库(BLOB字段)获取图片,然后将它们打印到我的网页上 我用一些类读取blob字段,将它们剪切成“方形”图片,然后用servlet将图片打印到页面上 在每一页我都这样做(读一些blob字段,剪切图片,打印大约10张图片) 我在租用的服务器上有自己的虚拟机,我有64MB的堆空间 有时,我会出现这样的错误: "Exception in thread "http-bio-12418-exec-26" java.lang.OutOfMemoryError: Java he

我有一个小网站,从mysql数据库(BLOB字段)获取图片,然后将它们打印到我的网页上

我用一些类读取blob字段,将它们剪切成“方形”图片,然后用servlet将图片打印到页面上

在每一页我都这样做(读一些blob字段,剪切图片,打印大约10张图片)

我在租用的服务器上有自己的虚拟机,我有64MB的堆空间

有时,我会出现这样的错误:

"Exception in thread "http-bio-12418-exec-26" java.lang.OutOfMemoryError: Java heap space"
所以,我觉得我的代码太“重”,就编辑了它。现在,我不时在tomcat日志中看到这个错误:

    Feb 10, 2014 7:23:11 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [javax.servlet.ServletException: java.sql.SQLException: Operation not allowed after ResultSet closed] with root cause
java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7139)
    at org.apache.jsp.NewsDinamic_jsp._jspService(NewsDinamic_jsp.java:104)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Feb 10, 2014 7:25:42 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [javax.servlet.ServletException: java.sql.SQLException: Operation not allowed after ResultSet closed] with root cause
java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7139)
    at org.apache.jsp.News_jsp._jspService(News_jsp.java:174)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
但这个错误毫无意义。我确信问题不在于数据库!如果我刷新页面,那么该网站将保持良好的工作状态。我肯定我必须在服务器上做些什么


注意:我从我的站点的lib文件夹中删除了JDBC库和我添加到porject中的所有其他库,并按照本论坛的一些建议将它们放在tomcat lib文件夹中。

我认为您的问题在于堆大小,因此首先需要查看JVM内存参数。实际上,您可以为JVM设置任意多的内存:

-Xmx2048m -> this param to set the max memory that the JVM can allocate
-Xms1024m -> the init memory that JVM will allocate on the start up
-XX:MaxPermSize=512M -> this for the max Permanent Generation memory
-XX:MaxNewSize=  -> this need to be 40% from your Xmx value
-XX:NewSize=614m -> this need to be 40% from your Xmx value

因此,首先确保您正确设置了此参数,然后如果您仍然收到
OutOfMemoryError

您可能正在关闭连接,请编辑您的代码,然后尝试使用resultset,发布相关代码,以便我们可以看到您在做什么。显示您的代码,尤其是在resultset.close()之后@fatman我添加了错误trackstacktrace,这很好,但是我们需要实际的java代码,我怎么能做到呢?jvm位于我租用的服务器上。我应该编辑tomcat/bin/catalina.sh吗?是的,将它们添加到
catalina_OPTS
下,例如:
catalina_OPTS=“-Xmx2048m-Xms1024m”
已经有这行catalina_OPTS=“$catalina_OPTS$JPDA_OPTS”。我应该删除它吗?只是添加一个新行吗?不,不要删除任何内容,只需确保您要查找的行是
export CATALINA_OPTS=“Arguments”
,然后在已经存在的任何内容旁边添加参数。我将这一行CATALINA_OPTS=“$CATALINA_OPTS$JPDA_OPTS”转换为这一行CATALINA_OPTS=“$CATALINA_OPTS$JPDA_OPTS–Xmx2048m-Xms1024m”。但我仍然得到相同的错误。我只是在服务器上得到这个错误,当我在我的计算机上测试站点时,它是完美的!