在JSP/JSTL中从Clob转换为String有时会导致关闭连接异常



我有这个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"将关闭连接。

最新更新