我有这个JSP代码,它执行一个非常简单的SQL查询。查询返回一个必须转换为String的Clob。我使用Oracle作为数据库,Resin作为服务器。
JSP在大多数情况下工作得很好,但有时会抛出SQLException,因为连接已经关闭。从Clob到String的转换期间抛出异常。
以下是导致此问题的代码:
<sql:setDataSource dataSource="jdbc/oracle"/>
<sql:transaction>
<sql:query scope="request" var="query" >
SELECT * FROM TABLE WHERE x=?
<sql:param value="${param.y}"/>
</sql:query>
<c:forEach items="${query.rows}" var="value">
<%
try {
Map map = (Map) pageContext.getAttribute("value");
CLOB clob = ((CLOB) map.get("someClob"));
String str= clob.getSubString(1, (int) clob.length()));
} catch (Exception ex) {
//print out exception
}
%>
</c:forEach>
</sql:transaction>
有没有人见过这个?
编辑:使用<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
答案 0 :(得分:0)
您使用的是&#34; http://java.sun.com/jstl/sql_rt&#34;或&#34; http://java.sun.com/jstl/sql&#34;标签名称空间
如果* / sql_rt比尝试后者。
CLOB很难处理,因为sql:query应该关闭ResultSet和关闭标签上的Statement。此时,CLOB可能会被分离&#39; (我不知道Oracle的CLOB在父ResultSet和Statement被关闭后是否可以运行。)
&#34; http://java.sun.com/jstl/sql&#34; &#39;查询&#39;标签不应该在sql:transaction标签关闭之前关闭连接作为&#34; http://java.sun.com/jstl/sql_rt&#34;将关闭连接。