Beispiel für eine Leistungsverbesserung für die Ausgabe von doppeltem SQL (SELECT) im Transaktionsskript mit ThreadLocal von Java

Beispiel für eine Leistungsverbesserung für die Ausgabe von doppeltem SQL (SELECT) im Transaktionsskript mit ThreadLocal von Java

Angenommen, Sie haben ein vorhandenes System und dieses System ist in einem Transaktionsskript implementiert. Angenommen, es gibt eine Logik, die im Transaktionsskript mehrmals dasselbe SQL (SELECT) ausgibt, was einen Leistungsengpass darstellt. (Beispielsweise wird der Prozess zum Erfassen von Daten vom Master häufig ausgeführt, ist jedoch im Wesentlichen derselbe, einschließlich der WHERE-Klausel, und es ist nicht erforderlich, SQL (SELECT) mehrmals auszugeben.)

Um diese Probleme zu lösen, wenn Sie genau dasselbe SQL (SELECT) ein zweites Mal oder später im Transaktionsskript ausgeben möchten, Dies ist ein Beispielprogramm, das darauf abzielt, die Leistung zu verbessern, indem die beim ersten Mal ausgegebene Ergebnismenge beibehalten und verbessert wird, damit sie wiederverwendet werden kann.

Angenommen, es ist wie eine Webanwendung, wird der Hauptthread für jeden Anforderungsbenutzer gestartet. Ich versuche zu reproduzieren, die Ergebnismenge global in einem Thread zu halten, damit sie nicht mit den Threads anderer Benutzer in Konflikt steht.

Konfigurationsbild des Beispielprogramms

Main SampleCallable [Req A] SampleAction SampleBiz ADao
SampleCallable [Req B] SampleAction SampleBiz ADao
SampleCallable [Req C] SampleAction SampleBiz ADao

Ergänzung

Das obige Konfigurationsbild zeigt Folgendes.

Beispielprogramm

Alle Beispielprogramme werden auf GitHub verwaltet. https://github.com/Yu-Yamaguchi/sample-thread-local

Hauptklasse

package you_name_is_yu.threadlocal;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.Logger;

/**
 *Eine Verarbeitungsklasse, die den Zugriff von mehreren Clients fast gleichzeitig simuliert.
 *Erstellen Sie mit ExecutorService mehrere Threads.
 *
 * @author You_name_is_YU
 *
 */
public class Main {

    private static final Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {

        //Flags zum Aktivieren von Leistungsverbesserungen mit ThreadLocal
        boolean enableThreadLocal = true;

        long start = System.currentTimeMillis();

        //Definition der Multithread-Verarbeitung unter der Annahme, dass fast gleichzeitig Anforderungen von drei Clients vorliegen
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        List<Callable<Void>> processes = new ArrayList<>();

        processes.add(new SampleCallable("taro", "101", 700, enableThreadLocal));
        processes.add(new SampleCallable("jiro", "101", 300, enableThreadLocal));
        processes.add(new SampleCallable("saburo", "101", 500, enableThreadLocal));

        //Führen Sie 3 gleichzeitige Anforderungen im Multithread aus
        try {
            threadPool.invokeAll(processes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

        long end = System.currentTimeMillis();
        logger.info("■ □ ■ □ ■ □ Gesamtausführungszeit (ms) ■ □ ■ □ ■ □");
        logger.info((end - start) + "ms");
    }
}

SampleCallable-Klasse

package you_name_is_yu.threadlocal;

import java.util.concurrent.Callable;

import you_name_is_yu.threadlocal.action.SampleAction;
import you_name_is_yu.threadlocal.dto.ParamDto;
import you_name_is_yu.threadlocal.util.ThreadLocalUtil;

/**
 *Eine Klasse, die mithilfe von ExecutorService tatsächlich zum Ausgangspunkt jedes Threads wird.
 *Dies ist ein Bild, das einer Benutzersitzung entspricht (Anfrage).
 *
 * @author You_name_is_YU
 *
 */
public class SampleCallable implements Callable<Void> {

    /**Benutzername für die Anrufausführung*/
    private String executingUser;
    /**ID-Bedingungen zum Eingrenzen des SELECT-Ziels mit Parametern vom Bildschirm (vorläufig)*/
    private String id;
    /**Zeit (Millisekunde), die angibt, wie schwer die SELECT-Anweisung ist. * Wird verwendet, um auszudrücken, dass SQL auf Pseudo-Weise schwer ist*/
    private long sleepTime;
    /**Flag für die Verwendung von ThreadLocal*/
    private boolean enableThreadLocal;

    public SampleCallable(String executingUser, String id, long sleepTime, boolean enableThreadLocal) {
        this.executingUser = executingUser;
        this.id = id;
        this.sleepTime = sleepTime;
        this.enableThreadLocal = enableThreadLocal;
    }

    @Override
    public Void call() throws Exception {

        //Wenn Sie ThreadLocal verwenden, initialisieren Sie es einmal.
        if (this.enableThreadLocal) {
            ThreadLocalUtil.initThreadLocalUtil();
        }

        //Aktion in Streben ausführen
        //* Ursprünglich wird es generiert und ausgeführt, wenn der Anwendungsserver die Anforderung empfängt, diesmal jedoch pseudo-reproduziert.
        SampleAction action = new SampleAction();
        action.doAction(new ParamDto(this.executingUser, this.id, this.sleepTime, this.enableThreadLocal));
        return null;
    }

    public String getExecutingUser() {
        return executingUser;
    }

    public void setExecutingUser(String executingUser) {
        this.executingUser = executingUser;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public long getSleepTime() {
        return sleepTime;
    }

    public void setSleepTime(long sleepTime) {
        this.sleepTime = sleepTime;
    }

    public boolean isEnableThreadLocal() {
        return enableThreadLocal;
    }

    public void setEnableThreadLocal(boolean enableThreadLocal) {
        this.enableThreadLocal = enableThreadLocal;
    }
}

SampleAction-Klasse

package you_name_is_yu.threadlocal.action;

import you_name_is_yu.threadlocal.biz.SampleBiz;
import you_name_is_yu.threadlocal.dto.ParamDto;

/**
 *Bestehendes System ist Struts1.Angenommen, ein Legacy-System wurde mit einem X-System erstellt.
 *Die Klasse, die der Action-Klasse entspricht.
 *
 * @author You_name_is_YU
 *
 */
public class SampleAction {

    public void doAction(ParamDto param) {
        SampleBiz biz = new SampleBiz();
        biz.doBiz(param);
    }
}

SampleBiz-Klasse

package you_name_is_yu.threadlocal.biz;

import java.util.List;

import org.apache.log4j.Logger;

import you_name_is_yu.threadlocal.dao.ADao;
import you_name_is_yu.threadlocal.dto.ADto;
import you_name_is_yu.threadlocal.dto.ParamDto;

/**
 *Eine Klasse, die Geschäftslogik darstellt, da sie in einem Transaktionsskript implementiert ist.
 *Es ruft einfach Dao auf und protokolliert eine Liste der SELECT-Ergebnisse.
 *
 * @author You_name_is_YU
 *
 */
public class SampleBiz {

    private static final Logger logger = Logger.getLogger(SampleBiz.class);

    /**
     *Geschäftslogik.
     *Mit einer Geschäftslogik wird SELECT unter denselben Bedingungen mehrmals aufgerufen, und das Erfassungsergebnis wird zur Ausgabe des Protokolls verwendet.
     *Ich denke, es ist selten, dasselbe immer und immer wieder auf dieselbe Weise zu tun.
     *Führen Sie beispielsweise in dieser Geschäftslogikklasse die Methoden anderer Klassen in mehreren Klassen, mehreren Methoden, aus.
     *Betrachten Sie zwangsweise den Fall, in dem es Fälle gibt, in denen derselbe Hauptwert separat erfasst, aber separat ausgewählt wird.
     *
     * @param param parameter
     */
    public void doBiz(ParamDto param) {

        long start = 0;
        long end = 0;

        ADao dao = new ADao();
        try {
            logger.info("=== 1. Start ===");
            start = System.currentTimeMillis();
            List<ADto> list = dao.selAList(param);
            for (ADto dto : list) {
                logger.info(dto);
            }
            end = System.currentTimeMillis();
            logger.info((end - start) + "ms");

            logger.info("=== 2. Start ===");
            start = System.currentTimeMillis();
            List<ADto> list2 = dao.selAList(param);
            for (ADto dto : list2) {
                logger.info(dto);
            }
            end = System.currentTimeMillis();
            logger.info((end - start) + "ms");

            logger.info("=== 3. Start ===");
            start = System.currentTimeMillis();
            List<ADto> list3 = dao.selAList(param);
            for (ADto dto : list3) {
                logger.info(dto);
            }
            end = System.currentTimeMillis();
            logger.info((end - start) + "ms");
        } catch (InterruptedException e) {
            e.printStackTrace();
            logger.error(e);
        }
    }
}

ADao Klasse

package you_name_is_yu.threadlocal.dao;

import java.util.ArrayList;
import java.util.List;

import you_name_is_yu.threadlocal.dto.ADto;
import you_name_is_yu.threadlocal.dto.ParamDto;
import you_name_is_yu.threadlocal.util.ThreadLocalUtil;
import you_name_is_yu.threadlocal.vo.where.AWhereVo;

/**
 *Dao, das auf dem A-Tisch arbeitet.
 * @author You_name_is_YU
 *
 */
public class ADao {

    public List<ADto> selAList(ParamDto param) throws InterruptedException {

        //Generieren Sie eine bedingte Vo for Where-Klausel
        AWhereVo where = new AWhereVo(param.getId());
        where.setId(param.getId());

        List<ADto> result = null;

        //Wenn ein Objekt mit denselben Bedingungen bereits in ThreadLocal gespeichert ist
        //Infolgedessen wird das Set wiederverwendet und unverändert zurückgegeben.
        if (param.isEnableThreadLocal()) {
            result = ThreadLocalUtil.get(where);

            if (result != null) {
                return result;
            }
        }

        result = new ArrayList<>();
        {
            //Ein Block, der eine SELECT-Anweisung ausführt und ein Erfassungsergebnis generiert
            //Der Grund für das Schlafen ist, dass SQL zu einem gewissen Grad schwer ist und es ein Pseudoausdruck ist, um das Ergebnis zu erhalten.
            Thread.sleep(param.getSleepTime());
            result.add(new ADto(param.getId(), "test"));
            result.add(new ADto(param.getId() + "+1", "test1"));
            result.add(new ADto(param.getId() + "+2", "test2"));
        }

        if (param.isEnableThreadLocal()) {
            ThreadLocalUtil.put(where, result);
        }

        return result;
    }
}

ThreadLocalUtil-Klasse

package you_name_is_yu.threadlocal.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import you_name_is_yu.threadlocal.dto.ADto;
import you_name_is_yu.threadlocal.vo.where.AWhereVo;

public class ThreadLocalUtil {

    private static final Logger logger = Logger.getLogger(ThreadLocalUtil.class);
    private static final ThreadLocal<HashMap<AWhereVo, List<ADto>>> THREAD_LOCAL = new ThreadLocal<HashMap<AWhereVo, List<ADto>>>();

    private ThreadLocalUtil() {
    }

    public static void initThreadLocalUtil() {
        clear();
        THREAD_LOCAL.set(new HashMap<AWhereVo, List<ADto>>());
    }

    public static void put(AWhereVo key, List<ADto> val) {
        Map<AWhereVo, List<ADto>> map = THREAD_LOCAL.get();
        map.put(key, val);
    }

    public static List<ADto> get(AWhereVo key) {
        List<ADto> result = null;
        Map<AWhereVo, List<ADto>> map = THREAD_LOCAL.get();
        if (map.containsKey(key)) {
            logger.info("Dort war");
            result = map.get(key);
        }

        return result;
    }

    public static void clear() {
        THREAD_LOCAL.remove();
    }
}

Ausführungsergebnisprotokoll

Wenn ThreadLocal ** nicht verwendet wird **

Überprüfen Sie, wie die Leistung aussieht, wenn ThreadLocal nicht verwendet wird, dh im Status des vorhandenen Systems. Dies ist das Ergebnis der Ausführung, indem der Teil der lokalen Variablen "boolean enableThreadLocal" in der Hauptmethode der Main-Klasse auf "false" angegeben wird.

2018-15-29 08:15:00,145 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
2018-15-29 08:15:00,846 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
2018-15-29 08:15:00,846 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
2018-15-29 08:15:00,846 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
2018-15-29 08:15:00,847 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :701ms
2018-15-29 08:15:00,847 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
2018-15-29 08:15:01,547 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
2018-15-29 08:15:01,548 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
2018-15-29 08:15:01,548 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
2018-15-29 08:15:01,549 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :702ms
2018-15-29 08:15:01,550 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
2018-15-29 08:15:02,251 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
2018-15-29 08:15:02,252 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
2018-15-29 08:15:02,252 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
2018-15-29 08:15:02,253 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :702ms

2018-15-29 08:15:00,151 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
2018-15-29 08:15:00,455 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
2018-15-29 08:15:00,456 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
2018-15-29 08:15:00,457 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
2018-15-29 08:15:00,459 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :307ms
2018-15-29 08:15:00,460 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
2018-15-29 08:15:00,761 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
2018-15-29 08:15:00,762 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
2018-15-29 08:15:00,763 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
2018-15-29 08:15:00,764 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :304ms
2018-15-29 08:15:00,764 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
2018-15-29 08:15:01,065 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
2018-15-29 08:15:01,065 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
2018-15-29 08:15:01,066 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
2018-15-29 08:15:01,066 [pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :302ms

2018-15-29 08:15:00,135 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
2018-15-29 08:15:00,645 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
2018-15-29 08:15:00,646 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
2018-15-29 08:15:00,647 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
2018-15-29 08:15:00,647 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :505ms
2018-15-29 08:15:00,647 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
2018-15-29 08:15:01,156 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
2018-15-29 08:15:01,156 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
2018-15-29 08:15:01,157 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
2018-15-29 08:15:01,158 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :510ms
2018-15-29 08:15:01,159 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
2018-15-29 08:15:01,661 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
2018-15-29 08:15:01,662 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
2018-15-29 08:15:01,663 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
2018-15-29 08:15:01,663 [pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :503ms

2018-15-29 08:15:02,254 [main] INFO  you_name_is_yu.threadlocal.Main :■ □ ■ □ ■ □ Gesamtausführungszeit (ms) ■ □ ■ □ ■ □
2018-15-29 08:15:02,255 [main] INFO  you_name_is_yu.threadlocal.Main :2167ms

Bei Verwendung von ThreadLocal **

Überprüfen Sie die Leistung bei Verwendung von ThreadLocal. Dies ist das Ergebnis der Ausführung, indem der Teil der lokalen Variablen "boolean enableThreadLocal" in der Hauptmethode der Main-Klasse als "true" angegeben wird.

Wenn Sie dieses Ergebnis überprüfen, können Sie feststellen, dass die Leistung verbessert wurde. (Natürlich reduzieren wir die Anzahl der vergeblichen SQLs ...)

[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :705ms
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]das Gleiche! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]das Gleiche! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :4ms
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]das Gleiche! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]das Gleiche! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101, name=test]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+1, name=test1]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-1]ADto [id=101+2, name=test2]
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :5ms

[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :310ms
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]das Gleiche! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]das Gleiche! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :2ms
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]das Gleiche! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]das Gleiche! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101, name=test]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+1, name=test1]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-2]ADto [id=101+2, name=test2]
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :2ms

[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1. Start ===
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :503ms
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 2. Start ===
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]das Gleiche! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]das Gleiche! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :3ms
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 3. Start ===
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]das Gleiche! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Dort war
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]das Gleiche! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101, name=test]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+1, name=test1]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :[pool-1-thread-3]ADto [id=101+2, name=test2]
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :3ms

2018-19-29 08:19:12,474 [main] INFO  you_name_is_yu.threadlocal.Main :■ □ ■ □ ■ □ Gesamtausführungszeit (ms) ■ □ ■ □ ■ □
2018-19-29 08:19:12,476 [main] INFO  you_name_is_yu.threadlocal.Main :757ms

Recommended Posts

Beispiel für eine Leistungsverbesserung für die Ausgabe von doppeltem SQL (SELECT) im Transaktionsskript mit ThreadLocal von Java
ChatWork4j für die Verwendung der ChatWork-API in Java
[Für Anfänger] Mindestbeispiel für die Anzeige von RecyclerView in Java
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden