一尘不染

jstl的sql标记如何工作​​?

jsp

我正在使用以下代码从我的jsp中查询数据库,但我想了解更多有关幕后情况的信息。

这是我的两个主要问题。

标签是直接访问ResultSet还是将查询结果存储在内存中的数据结构中?

何时关闭连接?

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<sql:query var="query" dataSource="${ds}" sql="${listQuery}"></sql:query>
<c:forEach var="row" items="${query.rows}" begin="0">
    ${row.data }
    ${row.more_data }
</c:forEach>

注意:我一直反对在jsp中运行查询,但是我的结果集太大,无法存储在我的动作和jsp之间的内存中。使用此标记库看起来是最简单的解决方案。


阅读 178

收藏
2020-06-08

共1个答案

一尘不染

基于org.apache.taglibs.standard.tag.common.sql.QueryTagSupport的来源的观察

taglib遍历ResultSet并将所有数据放入数组,Map和List中。因此,在开始循环之前,所有内容都已加载到内存中。

遇到查询开始标记时将打开连接(doStartTag方法)。遇到查询结束标记时将检索结果(doEndTag方法)。该连接在doFinally方法中关闭。

简而言之,这绝对可怕。

2020-06-08