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

时间:2014-07-28 15:31:49

标签: oracle jsp jstl resin

我有这个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" %>

1 个答案:

答案 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;将关闭连接。