문제

나는 다음 코드를 사용하여 쿼리 데이터베이스 내에서 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.이 태그를 사용하는 라이브러리처럼 보이는 가장 쉬운 솔루션입니다.

도움이 되었습니까?

해결책

관측 기반으로 소스에 org.apache.taglibs.표준입니다.태그입니다.일반적입니다.sql.QueryTagSupport

에서 사용하기 위한 것 횡단을 통해 ResultSet 및 모든 데이터의 배열을,지도할 수 있습니다.그래서,모든 것을 로드 메모리로 시작도 하기 전에 시스템을 제공합니다.

연결이 열리면 쿼리가 시작 태그가 발생(doStartTag 방법).의 결과를 검색할 때 쿼리를 끝 태그가 발생(doEndTag 방법).연결이 닫힌에서 doFinally 방법입니다.

그것은 간단히 말해서,그것은 절대적으로 끔찍합니다.

다른 팁

여기서 중요한 것은 이:javax.servlet.jsp.jstl.sql.결과

는 무엇 JSTL 사용의 결과로서 SQL 쿼리가 있습니다.을 보면 인터페이스에서,그것은 이 방법:

공공 java.util.SortedMap[]getRows()

c:forEach"알고있다"에 대한 javax.servlet.jsp.jstl.sql.그 결과,이후 결과 아무것도 하지 않는 다른 forEach 에 대해 알고 있(컬렉션,어레이,반복기,etc.).

그래서,모든 것을 의미하는 SQL 쿼리가 빨체에 RAM.

로 이동한 경우 쿼리에 JSP 하지 않았기 때문에 당신은 전체를로드 결과에서 설정한 컬렉션,다음처럼 보이지 않는 SQL 태그 문제를 해결하는 것입니다.

에서 진실을 봐야 하는 값 목록에 패턴이 있습니다.

"간단한"당신의 문제에 대한 해결책을 것을 만들자는 반복기"알고있다"에 대한 귀하의 ResultSet.이 랩 결과 집과 모든 것을 닫은 경우 예외가 발생한 경우 또는 결과 그것의 과정을 실행(과 같은 것입 forEach).종류의 특수 목적을 것입니다.

public class ResultSetIterator implements Iterator {

Connection con;
Statement s;
ResultSet rs;
Object curObject;
boolean closed;

public ResultSetIterator(Connection con, Statement s, ResultSet rs) {
    this.con = con;
    this.s = s;
    this.rs = rs;
    closed = false;
}

public boolean hasNext() {
    advance();
    return curObject != null;
}

public Object next() {
    advance();
    if (curObject == null) {
        throw new NoSuchElementException();
    } else {
        Object result = curObject;
        curObject = null;
        return result;
    }
}

public void remove() {
    throw new UnsupportedOperationException("Not supported yet.");
}

private void advance() {
    if (closed) {
        curObject = null;
        return;
    }
    if (curObject == null) {
        try {
            if (rs.next()) {
                curObject = bindObject(rs);
            }
        } catch (SQLException ex) {
            shutDown();
            throw new RuntimeException(ex);
        }
    }
    if (curObject == null) {
        // Still no object, must be at the end of the result set
        shutDown();
    }
}

protected Object bindObject(ResultSet rs) throws SQLException {
    // Bind result set row to an object, replace or override this method
    String name = rs.getString(1);
    return name;
}

public void shutDown() {
    closed = true;
    try {
        rs.close();
    } catch (SQLException ex) {
        // Ignored
    }
    try {
        s.close();
    } catch (SQLException ex) {
        // Ignored
    }
    try {
        con.close();
    } catch (SQLException ex) {
        // Ignored
    }
}

}

이것은,당연히,테스트하지 않았습니다.하지만 이후 JSTLs forEach 수 있는 작품으로 반복기,그것의 가장 간단한 객체가 있다면 여러분은 전달합니다.이드에서 당신은 전체 결과에 설정 하는 지 확인해 주시기 바랍니다.(으로 재미있는 표현은 아니지만의 주목할만한 어떻게 충분하지는 않지만 거의 완전히 달리는 반복기 결과 행동입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top