Exemple d'amélioration des performances pour l'émission de doublons SQL (SELECT) dans un script de transaction à l'aide de ThreadLocal de Java

Exemple d'amélioration des performances pour l'émission de doublons SQL (SELECT) dans un script de transaction à l'aide de ThreadLocal de Java

Supposons que vous ayez un système existant et que ce système soit implémenté dans un script de transaction. Et supposons qu'il y ait une logique qui émette le même SQL (SELECT) plusieurs fois dans le script de transaction, ce qui constitue un goulot d'étranglement en termes de performances. (Par exemple, le processus d'acquisition de données du maître apparaît plusieurs fois, mais il est fondamentalement le même, y compris la clause WHERE, et il n'est pas nécessaire d'émettre SQL (SELECT) plusieurs fois.)

Pour résoudre ces problèmes, si vous souhaitez émettre exactement le même SQL (SELECT) une deuxième fois ou plus tard dans le script de transaction, Il s'agit d'un exemple de programme qui vise à améliorer les performances en conservant l'ensemble de résultats émis la première fois et en l'améliorant afin qu'il puisse être réutilisé.

En supposant qu'il s'agit d'une application Web, le thread principal est démarré pour chaque utilisateur de la requête, J'essaie de reproduire en conservant le jeu de résultats globalement dans un thread afin qu'il ne soit pas en conflit avec les threads d'autres utilisateurs.

Image de configuration de l'exemple de programme

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

Supplément

L'image de configuration ci-dessus montre ce qui suit.

Exemple de programme

Tous les exemples de programmes sont gérés sur GitHub. https://github.com/Yu-Yamaguchi/sample-thread-local

Classe principale

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;

/**
 *Une classe de traitement qui simule l'accès à partir de plusieurs clients presque en même temps.
 *Créez plusieurs threads à l'aide d'ExecutorService.
 *
 * @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 {

        //Indicateurs permettant d'améliorer les performances à l'aide de ThreadLocal
        boolean enableThreadLocal = true;

        long start = System.currentTimeMillis();

        //Définition du traitement multi-thread en supposant qu'il y a des requêtes de trois clients presque en même temps
        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));

        //Exécuter 3 requêtes simultanées en multi-thread
        try {
            threadPool.invokeAll(processes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

        long end = System.currentTimeMillis();
        logger.info("■ □ ■ □ ■ □ Temps d'exécution total (ms) ■ □ ■ □ ■ □");
        logger.info((end - start) + "ms");
    }
}

SampleCallable classe

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;

/**
 *Une classe qui devient en fait le point de départ de chaque thread en utilisant ExecutorService.
 *Il s'agit d'une image correspondant à une session utilisateur (Request).
 *
 * @author You_name_is_YU
 *
 */
public class SampleCallable implements Callable<Void> {

    /**Nom d'utilisateur d'exécution d'appel*/
    private String executingUser;
    /**Conditions d'identification pour réduire la cible SELECT avec les paramètres de l'écran (provisoire)*/
    private String id;
    /**Temps (milliseconde) indiquant le poids de l'instruction SELECT * Utilisé pour exprimer que SQL est lourd d'une manière pseudo*/
    private long sleepTime;
    /**Indiquer s'il faut utiliser 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 {

        //Lorsque vous utilisez ThreadLocal, initialisez-le une fois.
        if (this.enableThreadLocal) {
            ThreadLocalUtil.initThreadLocalUtil();
        }

        //Exécuter l'action dans les entretoises
        //* À l'origine, il est généré et exécuté lorsque le serveur d'application reçoit la requête, mais cette fois, il est reproduit de manière pseudo.
        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, classe

package you_name_is_yu.threadlocal.action;

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

/**
 *Le système existant est Struts1.En supposant un système hérité construit avec le système X,
 *La classe qui correspond à la classe Action.
 *
 * @author You_name_is_YU
 *
 */
public class SampleAction {

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

Classe SampleBiz

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;

/**
 *Une classe qui représente la logique métier car elle est implémentée dans un script de transaction.
 *Il appelle simplement Dao et enregistre une liste de résultats SELECT.
 *
 * @author You_name_is_YU
 *
 */
public class SampleBiz {

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

    /**
     *Logique métier.
     *Avec une logique métier, SELECT est appelé plusieurs fois dans les mêmes conditions et le résultat de l'acquisition est utilisé pour sortir le journal.
     *Je pense qu'il est rare de refaire la même chose encore et encore avec la même méthode,
     *Par exemple, à partir de cette classe de logique métier, exécutez les méthodes d'autres classes dans plusieurs classes, plusieurs méthodes,
     *Considérez de force le cas où il y a des cas où la même valeur principale est acquise séparément mais sélectionnée séparément.
     *
     * @paramètre param paramètre
     */
    public void doBiz(ParamDto param) {

        long start = 0;
        long end = 0;

        ADao dao = new ADao();
        try {
            logger.info("=== 1er départ ===");
            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ème départ ===");
            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("=== 3e départ ===");
            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);
        }
    }
}

Classe ADao

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 effectuant des opérations sur la table A.
 * @author You_name_is_YU
 *
 */
public class ADao {

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

        //Générer une clause Vo for Where conditionnelle
        AWhereVo where = new AWhereVo(param.getId());
        where.setId(param.getId());

        List<ADto> result = null;

        //Si un objet avec les mêmes conditions est déjà stocké dans ThreadLocal
        //Par conséquent, l'ensemble est réutilisé et renvoyé tel quel.
        if (param.isEnableThreadLocal()) {
            result = ThreadLocalUtil.get(where);

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

        result = new ArrayList<>();
        {
            //Un bloc qui exécute une instruction SELECT et génère un résultat d'acquisition
            //La raison de dormir est que le SQL est lourd dans une certaine mesure et c'est une pseudo expression pour obtenir le résultat.
            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;
    }
}

Classe ThreadLocalUtil

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("Il y avait");
            result = map.get(key);
        }

        return result;
    }

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

Journal des résultats d'exécution

Lorsque ThreadLocal n'est ** pas utilisé **

Vérifiez à quoi ressemblent les performances lorsque ThreadLocal n'est pas utilisé, c'est-à-dire dans l'état du système existant. Ceci est le résultat de l'exécution en spécifiant la partie de la variable locale boolean enableThreadLocal dans la méthode principale de la classe Main à false.

2018-15-29 08:15:00,145 [pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1er départ ===
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ème départ ===
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 :=== 3e départ ===
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 :=== 1er départ ===
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ème départ ===
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 :=== 3e départ ===
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 :=== 1er départ ===
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ème départ ===
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 :=== 3e départ ===
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 :■ □ ■ □ ■ □ Temps d'exécution total (ms) ■ □ ■ □ ■ □
2018-15-29 08:15:02,255 [main] INFO  you_name_is_yu.threadlocal.Main :2167ms

Lors de l'utilisation de ThreadLocal **

Vérifiez les performances lors de l'utilisation de ThreadLocal. Ceci est le résultat de l'exécution en spécifiant la partie de la variable locale boolean enableThreadLocal dans la méthode principale de la classe Main comme true.

Si vous vérifiez ce résultat, vous pouvez voir que les performances ont été améliorées. (Bien sûr, nous réduisons le nombre de SQL à émettre en vain ...)

[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.biz.SampleBiz :=== 1er départ ===
[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ème départ ===
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]le même! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]le même! !!
[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 :=== 3e départ ===
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]le même! !!
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-1] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-1]le même! !!
[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 :=== 1er départ ===
[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ème départ ===
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]le même! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]le même! !!
[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 :=== 3e départ ===
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]le même! !!
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-2] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-2]le même! !!
[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 :=== 1er départ ===
[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ème départ ===
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]le même! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]le même! !!
[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 :=== 3e départ ===
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]le même! !!
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.util.ThreadLocalUtil :Il y avait
[pool-1-thread-3] INFO  you_name_is_yu.threadlocal.vo.where.AWhereVo :[pool-1-thread-3]le même! !!
[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 :■ □ ■ □ ■ □ Temps d'exécution total (ms) ■ □ ■ □ ■ □
2018-19-29 08:19:12,476 [main] INFO  you_name_is_yu.threadlocal.Main :757ms

Recommended Posts

Exemple d'amélioration des performances pour l'émission de doublons SQL (SELECT) dans un script de transaction à l'aide de ThreadLocal de Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Pour les débutants] Exemple minimum pour afficher RecyclerView en Java
J'ai essayé d'utiliser l'instruction Extended for en Java