Добавление набора результатов в ArrayList занимает так много времени - PullRequest
0 голосов
/ 14 марта 2019

Вот мой код, где я выполняю свой запрос и добавляю набор результатов в ArrayList.Модифицированный код

private ArrayList<String> getEventsFromShares() throws SQLException {
    Statement eventStmt = null;
    ResultSet rs = null;
    ArrayList<String> eventsList = new ArrayList<String>(10000);
    try {
        eventStmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        conn.setAutoCommit(false);
        System.out.println("Getting data from shares table");
        rs = eventStmt.executeQuery(
                "select s.event_id from tso_shares s join ife.entityids i on s.event_id = i.entityid where to_char(i.datemodified,'YYYY') = "
                        + year + "");
        eventStmt.setFetchSize(500);
        while (rs.next()) {
            eventsList.add(rs.getString(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        rs.close();
        eventStmt.close();
    }
    System.out.println("eventsMap" + eventsList.size());
    return eventsList;
}

запрос появляется всего за несколько секунд, но добавление в ArrayList занимает почти 15 минут.

Может ли кто-нибудь помочь мне определить проблему или как я могу улучшить свой код.

1 Ответ

3 голосов
/ 14 марта 2019

Похоже, вам нужен только столбец event_id из таблицы s, поэтому измените оператор SQL на select s.event_id вместо select s.*. Затем вы можете извлечь значение из ResultSet, используя rs.getString(1) вместо rs.getString("event_id")

Также вы можете указать начальную емкость для ArrayList, если приблизительно знаете, сколько строк вернет ваш SQL-запрос, например,

ArrayList<String> list = new ArrayList<>(500)
...