更新Oracle db中的BLOB数据时的java.sql.SQLException

时间:2014-12-19 06:26:09

标签: java spring oracle hibernate jdbc

我正在尝试使用hibernate中的Session.doWork()更新我的数据库中的BLOB列:

PreparedStatement pStmt = null;
ResultSet rs = null;
  try {
    String sql = 
      " SELECT " + "ITEM_IMAGE" + 
      " FROM " + "ITEM_IMAGES" + 
      " WHERE " + "ITEM_CODE" + " = ? " +
      " FOR UPDATE";
    pStmt = con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);
    pStmt.setString(1, fileDesign.getItem_code());
    rs = pStmt.executeQuery();
    if (rs.next()) {
      Blob blob = rs.getBlob("ITEM_IMAGE");
      blob.truncate(0);
      blob.setBytes(1, fileDesign.getFile()); //here getFile() returns byte[] and causes exception here
      rs.updateBlob("ITEM_IMAGE", blob);
      rs.updateRow();
    }
  }
  finally {
    if(rs != null) rs.close();
    if(pStmt != null) pStmt.close();
  }

上面的代码在我的本地系统中工作正常但在生产环境中产生以下异常:

org.hibernate.exception.GenericJDBCException: error executing work
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    at org.hibernate.impl.SessionImpl.doWork(SessionImpl.java:2001)
    at com.arex.cbs.dao.DesignMasterDaoImpl.saveDesignActionGifUpload(DesignMasterDaoImpl.java:432)
    at com.arex.cbs.service.DesignMasterManagerImpl.saveDesignActionGifUpload(DesignMasterManagerImpl.java:98)
    at com.arex.cbs.controller.DesignController.saveDesignActionGIF(DesignController.java:658)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Io exception: Software caused connection abort: socket write error
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:257)
    at oracle.jdbc.driver.T4CConnection.putBytes(T4CConnection.java:2037)
    at oracle.sql.BLOB.setBytes(BLOB.java:742)
    at com.arex.cbs.dao.DesignMasterDaoImpl$3.execute(DesignMasterDaoImpl.java:450)
    at org.hibernate.impl.SessionImpl.doWork(SessionImpl.java:1997)
    ... 36 more

已经坚持了几天: 这里可能出现什么问题?

0 个答案:

没有答案