From 79a5733993298ba53308c6e7b43b4d69db7159cb Mon Sep 17 00:00:00 2001 From: Deddy Syefria Date: Thu, 17 May 2018 02:21:31 +0700 Subject: [PATCH] use batch query for getting user handle --- .../services/view/util/DirectUtils.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/java/main/com/topcoder/direct/services/view/util/DirectUtils.java b/src/java/main/com/topcoder/direct/services/view/util/DirectUtils.java index c00500963..f9f391aa2 100644 --- a/src/java/main/com/topcoder/direct/services/view/util/DirectUtils.java +++ b/src/java/main/com/topcoder/direct/services/view/util/DirectUtils.java @@ -975,6 +975,11 @@ public final class DirectUtils { */ private static final String QUERY_GET_USERS_FROM_HANDLE = "SELECT user_id, handle FROM user WHERE handle in ("; + /** + * max ids per query of {@link #getUsersFromId} + */ + private static final int MAX_IDS_PER_QUERY = 1000; + private static final String QUERY_GET_USERS_FROM_ID = "SELECT user_id, handle FROM user WHERE user_id in ("; private static final String QUERY_GET_SECURITY_GROUP_FROM_ID = "SELECT group_id, description FROM security_groups " + @@ -3669,24 +3674,31 @@ public static List> getUsersFromId(Long[] uids) thr try{ con = DatabaseUtils.getDatabaseConnection(DBMS.COMMON_OLTP_DATASOURCE_NAME); - StringBuilder sbQueryUsers = new StringBuilder(QUERY_GET_USERS_FROM_ID); - for (int i = 0; i < uids.length; i++){ - sbQueryUsers.append(" ?,"); - } - sbQueryUsers.setCharAt(sbQueryUsers.length() - 1, ')'); + List> result = new ArrayList>(); + int to = 0; + int from = 0; + while (to < uids.length) { + StringBuilder sbQueryUsers = new StringBuilder(QUERY_GET_USERS_FROM_ID); + to += (to + MAX_IDS_PER_QUERY) > uids.length ? (uids.length - to) : MAX_IDS_PER_QUERY; + for (int i = from; i < to; i++) { + sbQueryUsers.append(" ?,"); + } + sbQueryUsers.setCharAt(sbQueryUsers.length() - 1, ')'); - ps = con.prepareStatement(sbQueryUsers.toString()); + ps = con.prepareStatement(sbQueryUsers.toString()); - for (int i = 0; i < uids.length; i++){ - ps.setString(i + 1, String.valueOf(uids[i])); - } - rs = ps.executeQuery(); - List> result = new ArrayList>(); - while (rs.next()){ - HashMap user = new HashMap(); - user.put("userId", String.valueOf(rs.getLong("user_id"))); - user.put("handle", rs.getString("handle")); - result.add(user); + for (int i = from; i < to; i++) { + ps.setString((i - from) + 1, String.valueOf(uids[i])); + } + rs = ps.executeQuery(); + + while (rs.next()) { + HashMap user = new HashMap(); + user.put("userId", String.valueOf(rs.getLong("user_id"))); + user.put("handle", rs.getString("handle")); + result.add(user); + } + from = to; } return result; }finally {