java.sql.SQLException: закрытое соединение при загрузке BLOB-файла в сервер приложений ie8 browser oracle 10g R2
Я пытаюсь загрузить вложение из базы данных Oracle 10g, когда гиперссылка нажата в распорках 1.3. что приводит к следующему исключению как
java.sql.SQLException: закрытое соединение в oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:137) в oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:174) в oracle.jdbdror.throwSqlException(DatabaseError.java:239) в oracle.sql.BLOB.getDBAccess(BLOB.java:875) в oracle.sql.BLOB.length(BLOB.java:142) в _jsp._CLA__DownLoadSelected._jspSelected (_CLA__Down 73) на com.orionserver[Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Http.OrionHttpJspPage.service(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) в javax.servlet.http.HttpServlet.service.:853) at com.evermind[Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:835) в com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:341) в com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:816) в com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.AJPRequestHandler.run(AJPRequestHandler.java:231) в com.evermind [Контейнеры сервера приложений Oracle для J2EE 10g (10.1.2.3.0)]. Server.http.AJPRequestHandler.run(AJPRequestHandler.java:136) в com.evermind [Сервер приложений Oracle Контейнеры для 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; }
Я отладил по коду с базой данных LIVE, но это исключение невозможно воспроизвести. Это исключение видел только в прямом эфире приложение его развернутого военного файла.
1 ответ
Благодаря @RoySix я смог решить эту проблему. как он сказал в комментарии, я установил байт BLOB в установщик объекта DTO перед закрытием соединения. затем получил тот метод Byte by 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());
}
.................