質問

私が使っている以下のコードはクエリのデータベースからjspしてしまいましたが、まず私かで起こっていることについて更にコンプライアンス-

これが私の二つの質問をします。

のタグのアクセスのResultSet直接、またはクエリの結果が格納されるようになっているdatastructureメモリ?

場合は、接続す。

<%@ 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

のtaglib横のResultSetをすべてのデータ配列マップのリストが表示されます。なので、すべてがメモリを装填する前にもプ.

の接続の開始時にクエリの開始タグが検出された(doStartTag法です。その結果を取得した場合、クエリを終了タグが検出された(doEndTag法です。接続が閉じ、doFinally方法です。

このように、絶対に何か。

他のヒント

キーもここで紹介:javax.servlet.jsp.jstl.sql.結果

そJSTL使用の結果としてSQLクエリ。また、インターフェースは、この方法:

公java.util.SortedMap[]getRows()

c:forEach"知の"javax.servlet.jsp.jstl.sql.結果、結果になるもforEach知(コレクション、配列の場合は、反復子です。

ですから、そのことを意味するSQLクエリーに吸引の全体の結果セットをアプリです。

場に移転検索すると、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できる反復子では、最も単純なオブジェクトみんなでパスです。この防止できますから負荷の全体の結果セットです。として興味深いもので、米ほとんどなので、今までとはまったく異なる反復子は、ResultSets行動です。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top