Я пытаюсь загрузить вложение из базы данных 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-приложение его развернутого файла войны.
Вы, вероятно, нужно переместить этот скриптлета код обработки блоб из вашей JSP в ваш метод вспомогательного класса, а затем получить метод getter для вашего JSP, чтобы получить байты, например 'getBytes()' вместо текущего 'getBlob()'. Вы не можете получить байты/поток из блоба после закрытия соединения, поэтому вам нужно сделать это, пока ваше соединение все еще открыто внутри метода класса-помощника. –
Я понимаю, что вы хотели сказать, но этот же код работает на одном сервере с другим приложением с тем же синтаксисом. я попробую, чтобы он вернулся к вам. спасибо за ответ @RoySix –
@RoySix благодарит решение, которое вы предоставили, работает так, чтобы проехать. Должен ли я опубликовать решение, или вы будете? –