Java &引用;关闭溪流;错误显然是由多次提交引起的

Java &引用;关闭溪流;错误显然是由多次提交引起的,java,servlets,tomcat7,Java,Servlets,Tomcat7,我正在Tomcat7环境中使用Java访问Oracle 9数据库 在context.xml中,我有 <Resource type="javax.sql.DataSource" auth="Container" name="jdbc/myDB" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:

我正在Tomcat7环境中使用Java访问Oracle 9数据库

context.xml中,我有

<Resource type="javax.sql.DataSource" auth="Container"
    name="jdbc/myDB"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:db" maxwait="10000" 
     username="temp" password="temp" maxActive="20" maxIdle="10"/>
我不想发布太多的代码,但我可能发布的代码太少。我不知道问题出在哪里,但如果有必要,我会更新问题

例外情况是:

SEVERE: Servlet.service() for servlet [jsp] in context with path [/charm] threw  exception [javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Stream    closed] with root cause
javax.servlet.jsp.JspTagException: Stream closed
at c.tags.sql.SQLIteratorTag.doEndTag(SQLIteratorTag.java:218)
at   org.apache.jsp.comp_005fpara_jsp._jspService(comp_005fpara_jsp.java:708)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
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:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.jspbook.GZIPFilter.doFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

从堆栈跟踪来看,这似乎与数据库连接无关,但看起来与从后端提交两个请求的用户有关。我已经更改了标签,但您可能想重新表述一下问题,并更改标题以获得更多关注

实际上,您的应用程序接收两个请求,并同时处理这两个请求。我已经有一段时间没有看到这一点了,但就我记忆所及,第一个出现了这个错误,因为浏览器关闭了TCP/IP连接,以便为第二个请求打开一个新的连接。(这对于HTTP/1.1来说可能有点过于简单,因为它重用了连接)

我想我们解决这个问题的方法是在生成页面时在页面上隐藏一个唯一的标识符,然后检测我们是否在同一个会话中收到了第二个POST请求和该UID,这表明他们提交了两次。那是很久以前的事了,所以我对我们到底做了什么,以及我们是如何阻止用户看到它的,还不太清楚;我确实记得,我们将第二个请求的HttpServletRequest包装在HttpServletRequestWrapper中,该包装似乎将请求从POST更改为GET,但我必须进行一些挖掘以了解发生了什么


编辑:很老了,但似乎有一个更好的方法来处理它,比我能找到的任何古老的东西都好(这似乎基本上是那篇文章中的选项2)。可能有几种常见的方法来处理此问题。

实际的异常是什么-您可以发布堆栈跟踪吗?你确定它来自数据库端,而不是服务器和浏览器之间的中断连接-这可能与点击两次的场景相匹配吗?嗨,Alex。我根据请求添加了堆栈跟踪。我不确定错误是从哪里来的!谢谢你,亚历克斯。我已经按照你的建议更新了标题。不过,我可以补充一点,使用OC4J应用服务器,java代码运行良好。这个问题是我把它移到Tomcat之后才出现的。所以我的想法是,可能是我错误地设置了数据库连接(这就是为什么我发布了context.xml的摘录),所以它没有以正确的方式处理同时发生的连接。@gordon613-也许OC4J已经在做某种过滤,隐藏了问题?当然是纯粹的猜测。因为它显然与数据库无关,所以我已经远远超出了我在这里的用途。祝你好运
SEVERE: Servlet.service() for servlet [jsp] in context with path [/charm] threw  exception [javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Stream    closed] with root cause
javax.servlet.jsp.JspTagException: Stream closed
at c.tags.sql.SQLIteratorTag.doEndTag(SQLIteratorTag.java:218)
at   org.apache.jsp.comp_005fpara_jsp._jspService(comp_005fpara_jsp.java:708)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
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:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.jspbook.GZIPFilter.doFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)