2016-04-07 2 views
1

Я пытаюсь загрузить вложение из базы данных oracle 10g при нажатии гиперссылки в struts 1.3. что приводит к следующему исключению, какjava.sql.SQLException: Закрытое соединение при загрузке файла blob в браузере ie8 oracle 10g Сервер приложений R2

java.sql.SQLException: Закрытое соединение в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:137) в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:174) at oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:239) at oracle.sql.BLOB.getDBAccess (BLOB.java:875) at oracle.sql.BLOB.length (BLOB.java:142) at _jsp._CLA__DownLoadSelected._jspService (_CLA__DownLoadSelected.java:73) at com.orionserver [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Http.OrionHttpJspPage.ser заместитель (OrionHttpJspPage.java:56) в oracle.jsp.runtimev2.JspPageTable.service (JspPageTable.java:356) на oracle.jsp.runtimev2.JspServlet.internalService (JspServlet.java:498) в oracle.jsp. runtimev2.JspServlet.service (JspServlet.java:402) at javax.servlet.http.HttpServlet.service (HttpServlet.java:853) at com.evermind [Контейнеры Oracle Application Server для J2EE 10g (10.1.2.3.0) ] .server.http.ServletRequestDispatcher.invoke (ServletRequestDispatcher.java:835) at com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. server.http.ServletRequestDispatcher.forwardInternal (ServletRequestDispatcher.java: 341) at com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.HttpRequestHandler.processRequest (HttpReques tHandler.java:816) at com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. server.http.AJPRequestHandler.run (AJPRequestHandler.java:231) at com.evermind [Oracle Application Контейнеры сервера для J2EE 10g (10.1.2.3.0)]. Server.http.AJPRequestHandler.run (AJPRequestHandler.java:136) at com.evermind [Контейнеры Oracle Application Server для J2EE 10g (10.1.2.3.0)]. util.ReleasableResourcePooledExecutor $ MyWorker.run (ReleasableResourcePooledExecutor.java:186) в java.lang.Thread.run (Thread.java:534)

1. гипер ссылка код выглядит следующим образом:

<a href="./jsp/DownLoadSelected.jsp?TrnID=3333"></a> 

2. dowloadSelected.jsp выглядит следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<%@ page contentType="text/html;charset=windows-1252" %> 
<%@ page import = "java.util.*" %> 
<%@ page import ="java.sql.*" %> 
    <%@ page import="java.sql.Blob.*" %> 
    <%@ page import="org.apache.commons.fileupload.*"%> 
     <%@ page import ="javax.naming.InitialContext" %> 
     <%@ page import = "java.io.*"%> 
      <%@ page import ="java.sql.PreparedStatement.*" %> 
      <%@ page import="oracle.sql.BLOB"%> 
       <%@ page import="java.sql.Blob"%> 
       <%@ page import="org.iibf.claim.dto.*"%> 
       <html> 
        <head> 
        <title>DownLoad File Form</title> 
         <form name="upload1" method=get ENCTYPE='multipart/form-data'> 
         <link href="../stylesheet/style.css" rel="stylesheet" type="text/css" /> 
         <script> 
         alert("Download pdf"); 
         </script> 
         </head> 
         <body> 

         <form name="RT_DownloadAttach"> 

<% 
String PurchaseId=request.getParameter("TrnID"); 

    System.out.println(PurchaseId+ "<- trnid "); 

    LM_DownLoadAttachDto objRT_DownLoadAttachDTO =org.iibf.claim.util.CLA_Conveyance_recommenHelper.getSelectedDownload(Purchas  eId); 

//old line 
    Blob blob= objRT_DownLoadAttachDTO.getblob(); 
System.out.println("with sql blob : "+blob.length()); 

long l =blob.length(); 
oracle.sql.BLOB bbb = objRT_DownLoadAttachDTO.getblob(); 
    l =bbb.length(); 
byte[] ba =blob.getBytes(1,(int)bbb.length()); 
//java.io.InputStream fis = rs.getBlob(2).getBinaryStream(); 
String fileName = objRT_DownLoadAttachDTO.getName(); 
OutputStream os = response.getOutputStream(); 
response.setContentType("text/ascii"); 
response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\""); 
    response.setHeader("cache-control", "no-cache"); 
    os.write(ba); 
os.close(); %> 
    <div id="body11"> 
    </body> 
    <html> 

3. вспомогательный метод класса выглядит

public static DownLoadAttachDto getSelectedDownload(String ReqID) throws SQLException { 
String FunctionName="getSelectedDownload"; 
    boolean update = false; 
    String strSQL=""; 
    int updatecount=0; 
    Collection collAllDownLoad = null; 
    PreparedStatement prepStmt= null; 
    Connection objConnection = null; 
    ResultSet rs = null; 
    Vector vecDownload = new Vector(); 
    LM_DownLoadAttachDto objRT_DownLoadAttachDTO=null; 
    strSQL = " SELECT UD.* FROM CT_UPLOADATTACHMENT_DTLS UD " + 
      " WHERE UD.TRN_ID = ? ";   
    try { 
     objConnection = CLA_DALHelper.getConnection(); 
     prepStmt = objConnection.prepareStatement(strSQL); 
     prepStmt.setString(1,ReqID); 
     rs = prepStmt.executeQuery(); 
     while(rs.next()) { 
     objRT_DownLoadAttachDTO = new LM_DownLoadAttachDto(); 

     objRT_DownLoadAttachDTO.setName(rs.getString("ATTACH_NAME")); 

     BLOB b = (oracle.sql.BLOB)rs.getBlob("ATTACH_FILE"); 
     System.out.println("with in recom b helper blob : "+b.length()); 
     Blob bb =rs.getBlob("ATTACH_FILE"); 
     System.out.println("with recom bb blob : "+bb.length()); 
     long l = bb.length();   objRT_DownLoadAttachDTO.setblob((oracle.sql.BLOB)rs.getBlob("ATTACH_FILE")); 
     } 
    } 
    catch(SQLException ex) { 
     throw new SQLException("Unable to get File " + ex.getMessage()); 
    } 
    finally{ 
     if(prepStmt!=null) 
     prepStmt.close(); 
    if(rs!=null) 
     rs.close(); 
     objConnection.close();  
    } return objRT_DownLoadAttachDTO; } 

Я Debugged треска e с базой данных LIVE, но это исключение невозможно воспроизвести. В этом исключении было замечено LIVE-приложение его развернутого файла войны.

+1

Вы, вероятно, нужно переместить этот скриптлета код обработки блоб из вашей JSP в ваш метод вспомогательного класса, а затем получить метод getter для вашего JSP, чтобы получить байты, например 'getBytes()' вместо текущего 'getBlob()'. Вы не можете получить байты/поток из блоба после закрытия соединения, поэтому вам нужно сделать это, пока ваше соединение все еще открыто внутри метода класса-помощника. –

+0

Я понимаю, что вы хотели сказать, но этот же код работает на одном сервере с другим приложением с тем же синтаксисом. я попробую, чтобы он вернулся к вам. спасибо за ответ @RoySix –

+0

@RoySix благодарит решение, которое вы предоставили, работает так, чтобы проехать. Должен ли я опубликовать решение, или вы будете? –

ответ

0

Благодаря @RoySix, я смог решить эту проблему. как он сказал в комментарии, я установил байт BLOB в объекте объекта DTO перед закрытием соединения. затем получил этот байт методом метода getter на DTO, который получается из класса Helper.

Ниже, как JSP выглядеть

<%@ page contentType="text/html;charset=windows-1252" %> 
<%@ page import = "java.util.*" %> 
<%@ page import ="java.sql.*" %> 
    <%@ page import="java.sql.Blob.*" %> 
    <%@ page import="org.apache.commons.fileupload.*"%> 
    <%@ page import ="javax.naming.InitialContext" %> 
    <%@ page import = "java.io.*"%> 
     <%@ page import ="java.sql.PreparedStatement.*" %> 
     <%@ page import="oracle.sql.BLOB"%> 
      <%@ page import="java.sql.Blob"%> 
      <%@ page import="org.iibf.claim.dto.*"%> 
      <html> 
       <head> 
       <title>DownLoad File Form</title> 
        <form name="upload1" method=get ENCTYPE='multipart/form-data'> 
        <link href="../stylesheet/style.css" rel="stylesheet" type="text/css" /> 
        <script> 
        alert("Download pdf"); 
        </script> 
        </head> 
        <body> 

        <form name="RT_DownloadAttach"> 

<% 
    String PurchaseId=request.getParameter("TrnID"); 
    System.out.println(PurchaseId+ "<- trnid "); 

    LM_DownLoadAttachDto objRT_DownLoadAttachDTO  =org.iibf.claim.util.CLA_Conveyance_recommenHelper.getSelectedDownload(Purchas  eId); 
byte[] ba =objRT_DownLoadAttachDTO.getAttachmentByte(); 
//java.io.InputStream fis = rs.getBlob(2).getBinaryStream(); 
String fileName = objRT_DownLoadAttachDTO.getName(); 
OutputStream os = response.getOutputStream(); 
response.setContentType("text/ascii"); 
response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\""); 
    response.setHeader("cache-control", "no-cache"); 
    os.write(ba); 
os.close(); %> 
    <div id="body11"> 
    </body> 
    <html> 

вспомогательный метод класса выглядит как

...................... 
while(rs.next()) { 
    objRT_DownLoadAttachDTO = new LM_DownLoadAttachDto(); 
    objRT_DownLoadAttachDTO.setName(rs.getString("ATTACH_NAME")); 
    BLOB b = (oracle.sql.BLOB)rs.getBlob("ATTACH_FILE");   
    Blob bb =rs.getBlob("ATTACH_FILE");   
    objRT_DownLoadAttachDTO.setblob((oracle.sql.BLOB) rs.getBlob("ATTACH_FILE"));   
    oracle.sql.BLOB bbb = (oracle.sql.BLOB)rs.getBlob("ATTACH_FILE"); 
    l =bbb.length(); 
    byte[] ba =blob.getBytes(1,(int)bbb.length()); 
} 
................. 
Смежные вопросы