當有 50k 行時,最后的 for 回圈非常慢。有沒有更快的方法從javax.servlet.jsp.jstl.sql.Result的行中獲取字串串列?使用不同的集合?以不同的方式轉換字串?
查詢絕對沒問題。我在這里不包括用于運行它的自定義物件。我無法改變它們。我想你只需要知道它回傳一個結果。
(我沒有寫任何代碼。)
private int m_ObjectGroupId;
private int m_FetchSize;
private ArrayList<String> m_InternalIds;
...成員初始化后的方法...
String internalIdString = "INTERNALID";
String selectSql = "SELECT " internalIdString " FROM MODELOBJECT WHERE OBJECTGROUPID = ?";
ArrayList<Object> valuesToSet = new ArrayList<Object>();
valuesToSet.add(m_ObjectGroupId);
BaseForPreparedStatement selectStatement = new BaseForPreparedStatement(selectSql.toString(), valuesToSet);
SqlQueryResult queryResult = DBUtils.executeQueryRS(p_Context, selectStatement, getConnection(), m_FetchSize);
Result result = queryResult.getResult();
m_InternalIds = new ArrayList<>(result.getRowCount());
for (int i = 0; i < result.getRowCount(); i ) {
m_InternalIds.add((String)result.getRows()[i].get(internalIdString));
}
更新:查詢只需要 1 秒,而回圈需要 30 秒。result.getRows().getClass() 是一個 java.util.SortedMap[]。
uj5u.com熱心網友回復:
取決于javax.servlet.jsp.jstl.sql.Result#getRows()(例如https://github.com/apache/tomcat-taglibs-standard/blob/main/impl/src/main/java/org/apache/taglibs/standard/tag/的 Tomcat 標簽庫的實作) common/sql/ResultImpl.java#L134)getRows()每次呼叫它時可能會做不必要的作業。
您可以將提取回圈重寫為
for (SortedMap m: result.getRows()) {
m_InternalIds.add((String) m.get(internalIdString));
}
只呼叫getRows()一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429471.html
