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.
Main | → | SampleCallable [Req A] | → | SampleAction | → | SampleBiz | → | ADao |
→ | SampleCallable [Req B] | → | SampleAction | → | SampleBiz | → | ADao | |
→ | SampleCallable [Req C] | → | SampleAction | → | SampleBiz | → | ADao |
L'image de configuration ci-dessus montre ce qui suit.
Tous les exemples de programmes sont gérés sur GitHub. https://github.com/Yu-Yamaguchi/sample-thread-local
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");
}
}
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;
}
}
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);
}
}
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);
}
}
}
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;
}
}
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();
}
}
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
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