背景:UAT测试环境(WebLogic,Oracle),一直运行良好,在不知道有什么细微改动的情况下,出现异常。
错误日志:
2012-07-31 14:45:04,723 WARN  org.springframework.util.FileCopyUtils [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)']
Could not close Writerjava.io.IOException: No more data to read from socket
at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:716)
at oracle.jdbc.driver.OracleClobWriter.flushBuffer(OracleClobWriter.java:270)
at oracle.jdbc.driver.OracleClobWriter.close(OracleClobWriter.java:232)
at org.springframework.util.FileCopyUtils.copy(FileCopyUtils.java:234)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator$3.populateLob(OracleLobHandler.java:269)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:341)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.setClobAsString(OracleLobHandler.java:265)
at workflowApp.worksheetquery.CommonWorksheetQueryHandler$2.setValues(CommonWorksheetQueryHandler.java:426)
at org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback.doInPreparedStatement(AbstractLobCreatingPreparedStatementCallback.java:70)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:537)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:565)
at workflowApp.worksheetquery.CommonWorksheetQueryHandler.updateWorksheetApproveHistoryByWorksheetId(CommonWorksheetQueryHandler.java:424)
at jsp_servlet.__test._jspService(__test.java:96)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(Unknown Source)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
2012-07-31 14:45:04,725 ERROR org.springframework.jdbc.support.lob.OracleLobHandler [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)']
Could not free Oracle LOBjava.sql.SQLException: Io exception: Broken pipe
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.ttc7.TTC7Protocol.freeTemporaryLob(TTC7Protocol.java:3271)
at oracle.sql.LobDBAccessImpl.freeTemporary(LobDBAccessImpl.java:741)
at oracle.sql.CLOB.freeTemporary(CLOB.java:1035)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:599)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.close(OracleLobHandler.java:412)
at org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback.doInPreparedStatement(AbstractLobCreatingPreparedStatementCallback.java:74)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:537)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:565)
at workflowApp.worksheetquery.CommonWorksheetQueryHandler.updateWorksheetApproveHistoryByWorksheetId(CommonWorksheetQueryHandler.java:424)
at jsp_servlet.__test._jspService(__test.java:96)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(Unknown Source)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
2012-07-31 14:45:04,728 ERROR workflowApp.worksheetquery.CommonWorksheetQueryHandler [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)']
更新工单历史意见发生错误:org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [UPDATE WORKSHEET SET APPROVEHISTORY = ? WHERE WSID = ?]; SQL state [null]; error code [17410]; No more data to read from socket; nested exception is java.sql.SQLException: No more data to read from socket2012-07-31 14:45:04,728 ERROR workflowApp.worksheetquery.CommonWorksheetQueryHandler [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)']
更新工单历史意见发生错误:org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [UPDATE WORKSHEET SET APPROVEHISTORY = ? WHERE WSID = ?]; SQL state [null]; error code [17410]; No more data to read from socket; nested exception is java.sql.SQLException: No more data to read from socket
<Jul 31, 2012 3:26:44 PM GMT+08:00> <Error> <JDBC> <BEA-001131> <Received an exception when closing a cached statement for the pool "WF_DEFINE": java.sql.SQLException: Io exception: Broken p
ipe.>
执行代码:
String sql = "UPDATE WORKSHEET SET APPROVEHISTORY = ? WHERE WSID = ?";

final String worksheetid = worksheetId;
final String approvehistory = approveHistory;
try{
jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(this.oracleLobHandler){
protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException {
lobCreator.setClobAsString(ps, 1, approvehistory);
ps.setString(2, worksheetid);
注:APPROVEHISTORY 是一个CLOB字段。说明:同样的代码,我用本地程序连接测试环境数据库时,运行没问题。