<sql:setDataSource var="domainds" driver="${DS_JDBCDRIVER}" url="${DS_URL}" user="${DS_USERNAME}" password="${DS_ENCRYPTED_PASSWORD}" scope="session"/>
as documented here
http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/sql/setDataSource.html
and then I use the var datasource as in:
<sql:query var="rsMessageCount" dataSource="${domainds}" scope="request"> select DATA_VALUE from ${datatable} where MSG_GUID='${theMSGGUIDvalue}' </sql:query>
it all works fine until I try to do a
java.sql.Blob blob = (java.sql.Blob)((org.apache.taglibs.standard.tag.common.sql.ResultImpl)(request.getAttribute("rsMessageCount"))).getRowsByIndex()[0][0]; if (blob != null) { byte[] bdata = blob.getBytes(1, (int) blob.length()); String text = new String(bdata);
When I do the blob.getBytes bit, I get a
java.sql.SQLException: Closed Connection oracle.sql.BLOB.getDBAccess(BLOB.java:1087) oracle.sql.BLOB.getBytes(BLOB.java:331) oracle.sql.BLOB.getBytes(BLOB.java:217)
This ONLY if I use setDataSource. If I use a datasource declared in the context.xml file, I have no issue.
This is the only way I managed to make it work:
public static String getBlobData(String driver, String url, String username, String password, String sqlQuery) throws Exception { String result = ""; Class.forName(driver); Connection conn = DriverManager.getConnection(url, username, password); try { Statement stmt = conn.createStatement(); try { ResultSet rset = stmt.executeQuery(sqlQuery); try { rset.next(); java.sql.Blob blob = (java.sql.Blob) rset.getBlob(1); if (blob != null) { byte[] bdata = blob.getBytes(1, (int) blob.length()); String text = new String(bdata); text = text.replace("<", "<"); // the second is ampersand followed by lt; result = text; } else { result = "empty body"; } } finally { try { rset.close(); } catch (Exception e) { e.printStackTrace(); } } } finally { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } } finally { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } return result; }
No comments:
Post a Comment