在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    分組并發(fā)批量搞定查詢高性能

    前言

    針對(duì)數(shù)據(jù)庫(kù)的查詢操作,使用批量方式自然是要快速不少,本文則介紹關(guān)于批量的API實(shí)現(xiàn)。本共實(shí)現(xiàn)兩類API實(shí)現(xiàn),一類是串行的分組并發(fā),一類是并行的分組并發(fā)。

    • 利用Lists.partition分組
    • CompletableFuture.supplyAsync多線程并發(fā)

    串行的分組并發(fā)

    public List queryInCondition(String key, Object… value) { long current = System.currentTimeMillis(); Objects.requireNonNull(key, “Filter key cant be null.”); if (value == null || value.length == 0) { LOG.warn(“Return empty data, cause query by key:{},but value is empty”, key); return Collections.emptyList(); } List result = Lists.newArrayListWithCapacity(value.length); if (value.length MAX_PARTITION_DATA_COUNT ? MAX_PARTITION_DATA_COUNT : value.length / MIN_PARTITION; List valuePartition = Lists.partition(Lists.newArrayList(value), SPLIT); for (List values : valuePartition) { result.addAll(queryByKeyValues(currentSession(), key, values)); } } final long cost = System.currentTimeMillis() – current; LOG.debug(“QIC with key:{},Data Count:{}, Speed:{}/s, Time Cost:{} ms”, key, result.size(), result.size() * 1000 / cost, cost); return result; }

    并行的分組并發(fā)

    public List queryInConditionHighSpeed(String key, Object… value) { long current = System.currentTimeMillis(); Objects.requireNonNull(key, “Filter key cant be null.”); if (value == null || value.length == 0) { LOG.warn(“Return empty data, cause query by key:{},but value is empty”, key); return Collections.emptyList(); } if (value.length { List resultList = Collections.emptyList(); Session session = null; try { session = sessionFactory.openSession(); resultList = queryByKeyValues(session, key, values); } finally { if (session != null && session.isOpen()) session.close(); } return resultList; }); final long cost = System.currentTimeMillis() – current; LOG.debug(“QICH with key:{},Data Count:{}, Speed:{}, Time Cost:{} ms”, key, result.size(), result.size() * 1000 / cost, cost); return result; }

    輔助hibernate過(guò)濾查詢方法

    private List queryByKeyValues(Session session, String key, List values) { CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(getEntityClass()); Root root = query.from(getEntityClass()); query.select(root); CriteriaBuilder.In in = criteriaBuilder.in(root.get(key)); values.forEach(in::value); query.where(in); final Query queryExe = session.createQuery(query); LOG.trace(“Hibernate execute SQL:{}”, queryExe.getQueryString()); List resultList = queryExe.getResultList(); return resultList; }

    ConcurrencyUtil輔助類

    自定義并發(fā)輔助類

    import com.google.common.collect.Lists;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.List;import java.util.Objects;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutorService;import java.util.concurrent.Future;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.function.Function;import static java.util.stream.Collectors.toList;public class ConcurrencyUtil { private static final Logger LOG = LoggerFactory.getLogger(ConcurrencyUtil.class); private static final int MAX_PARTITION_SIZE = 2000; /** * 提供大數(shù)據(jù)進(jìn)行分組并發(fā)處理能力 * * @param executorService 并發(fā)執(zhí)行線程池 * @param data 待處理數(shù)據(jù) * @param function 針對(duì)分組后的每組數(shù)據(jù)的處理邏輯 * @param 數(shù)據(jù)類型 * @param 返回?cái)?shù)據(jù)類型 * @return */ public static List groupInvoke(ExecutorService executorService, List data, Function function) { int threadCount = getPoolSize(executorService); int i = (data.size() + threadCount) / threadCount; List partition = Lists.partition(data, i > MAX_PARTITION_SIZE ? MAX_PARTITION_SIZE : i); final List<CompletableFuture> futures = partition.stream().map(p -> CompletableFuture.supplyAsync(() -> function.apply(p) , executorService)).collect(toList()); List result = futures.stream().map(p -> { try { return p.get(5, TimeUnit.MINUTES); } catch (Exception e) { LOG.error(“Concurrency groupInvoke error.”, e); } return null; }).filter(Objects::nonNull).flatMap(List::stream).filter(Objects::nonNull).collect(toList()); return result; } public static List invoke(ExecutorService executorService, List data, Function function) { List futures = Lists.newArrayListWithCapacity(data.size()); for (T datum : data) { final Future future = executorService.submit(() -> function.apply(datum)); futures.add(future); } List result = Lists.newArrayListWithCapacity(data.size()); for (Future future : futures) { try { result.add(future.get(5, TimeUnit.MINUTES)); } catch (Exception e) { LOG.error(“Concurrency invoke error.”, e); } } return result.stream().filter(Objects::nonNull).collect(toList()); } private static int getPoolSize(ExecutorService executorService) { int threadCount = 10; if (executorService instanceof ThreadPoolExecutor) { threadCount = ((ThreadPoolExecutor) executorService).getCorePoolSize(); } return threadCount <= 0 ? 10 : threadCount; }}

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月21日 12:10
    下一篇 2022年6月21日 12:10

    相關(guān)推薦

    • 怎么轉(zhuǎn)行總結(jié)出成功轉(zhuǎn)行的3個(gè)步驟

      01 前段時(shí)間,由麥可思研究院發(fā)布的《就業(yè)藍(lán)皮書:2019年中國(guó)大學(xué)生就業(yè)報(bào)告》顯示,2018大學(xué)畢業(yè)生半年內(nèi)的離職率為33%,主動(dòng)離職的主要原因是“個(gè)人發(fā)展空間不夠”和“薪資福利…

      2022年11月26日
    • 開個(gè)內(nèi)衣店利潤(rùn)有多大(新手開內(nèi)衣店怎么開)

      想當(dāng)老板的人,想去做一件事的人,想去提高能力的人,只要有了這個(gè)想法,他只要想行動(dòng),你攔都攔不住。 只不過(guò)說(shuō)有些人會(huì)尋到正確的方法,不管是機(jī)緣巧合,還是漫無(wú)目的之后的巧遇,你不行動(dòng),…

      2022年11月26日
    • 個(gè)人怎么做抖音帶貨(個(gè)人做抖音帶貨能賺錢嗎)

      抖音如今是大家很熟悉的短視頻平臺(tái),不過(guò)現(xiàn)在的抖音卻不只是短視頻那么簡(jiǎn)單,它的功能非常豐富,其中一個(gè)就是可以帶貨,相信很多小伙伴都有在抖音上買過(guò)東西,抖音如今的變現(xiàn)能力也是不容小覷的…

      2022年11月25日
    • 英雄聯(lián)盟暗裔傳說(shuō)11.24答案分享 暗裔傳說(shuō)第四天答案攻略

      英雄聯(lián)盟手游能力者·叁-暗裔傳說(shuō)第四天答案是什么?暗裔傳說(shuō)11月24日是活動(dòng)的第四天,今天的題目也更新了三個(gè)新問(wèn)題,題目和答案小編已經(jīng)分享在下面,大家直接通過(guò)攻略就可以了解到暗裔傳…

      2022年11月25日
    • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

      CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

      2022年11月25日
    • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

      如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

      2022年11月24日
    • 《寶可夢(mèng)朱紫》攻擊努力值怎么刷?攻擊努力值速刷方法分享

      寶可夢(mèng)朱紫很需要攻擊努力值,有很多玩家感覺攻擊努力值刷的太慢了,怎么才能快速刷,下面就給大家?guī)?lái)寶可夢(mèng)朱紫攻擊努力值速刷方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 攻…

      2022年11月24日
    • 英雄聯(lián)盟手游暗裔傳說(shuō)11.24答案 LOL手游能力者·叁-暗裔傳說(shuō)第四天答案

      英雄聯(lián)盟手游能力者·叁-暗裔傳說(shuō)第四天答案是什么?暗裔傳說(shuō)11月24日是活動(dòng)的第四天,今天的題目也更新了三個(gè)新問(wèn)題,題目和答案小編已經(jīng)分享在下面,大家直接通過(guò)攻略就可以了解到暗裔傳…

      2022年11月24日
    • 淘寶直播平臺(tái)抽成多少(淘寶直播平臺(tái)抽成比例)

      隨著時(shí)代的發(fā)展,現(xiàn)在直播帶貨已經(jīng)成為主要帶貨方式,其中淘寶是主流帶貨平臺(tái),不少人在上面直播帶貨賺錢,一些小伙伴也想加入,那么淘寶直播平臺(tái)抽成多少?下面小編為大家?guī)?lái)淘寶直播平臺(tái)抽成…

      2022年11月24日
    • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

      直播帶貨無(wú)論是對(duì)于商家來(lái)說(shuō)還是主播收益都是非??捎^的,所以不少平臺(tái)都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)?lái)淘寶直播開通后帶…

      2022年11月24日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息