我有这个JSP代码,它执行一个非常简单的SQL查询。查询返回一个Clob,该Clob必须转换为String。我使用Oracle为数据库,树脂为服务器。
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>
有人见过这个吗?
编辑:using <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
您是使用"http://java.sun.com/jstl/sql_rt"还是"http://java.sun.com/jstl/sql"标签命名空间?
如果*/sql_rt,则尝试使用后者。
clob可能很难处理,因为sql:query应该在标记关闭时关闭ResultSet和Statement。在这一点上,CLOB可能会离开"分离"(我不知道如果Oracle的CLOB可以在父ResultSet和语句关闭后运行)。
"http://java.sun.com/jstl/sql"'query'标签不应该在sql:transaction标签关闭之前关闭连接,因为"http://java.sun.com/jstl/sql_rt"将关闭连接。