・ DI pour enum ・ Économie de mémoire ・ Prend en charge une charge élevée avec la fonction de cache · Lecture seulement ・ Je l'utilise pour le classement, etc. ・ Prend en charge à la fois Spring Framework et Spring Boot ・ Pour les cartographes, veuillez lire et définir comme il convient. -Initialiser lors de la mise à jour du contexte
・ Spring Framework 4.2.9 ・ Botte à ressort 2.2.1 · Java 1.8 ・ Windows 10 64 bits
SampleRankingSingletonService · Service Singleton (enum) qui acquiert et conserve les données ・ Je veux DI mapper avec @Autowired, mais je ne peux pas, alors créez un service d'initialisation séparé. ・ Je pense qu'il vaut mieux ajouter un programme pour traiter les données. (L'émission de SQL est une lourde charge)
public enum SampleRankingSingletonService {
INSTANCE;
//Lecture de l'ajustement de la valeur du délai d'attente
public static final int TIMEOUT_SEC = 1800;
private static final Object lock = new Object();
private LocalDateTime queryDate;
//Dernier classement
private List<Sample> latestRanking = new CopyOnWriteArrayList<>();
private SampleMapper sampleMapper;
private SampleRankingSingletonService () {
}
public static SampleRankingSingletonService getInstance() {
return INSTANCE;
}
private boolean isTimeout() {
LocalDateTime execDate = LocalDateTime.now();
if (queryDate == null) { return true; }
LocalDateTime expireDate = queryDate.plusSeconds(TIMEOUT_SEC);
if (expireDate.isBefore(execDate)) {
return true;
}
return false;
}
public synchronized void reload() {
queryDate = LocalDateTime.now();
latestRanking = sampleMapper.selectLatestRanking(); // <-Emission SQL d'acquisition de classement
}
//Appelez avant d'effectuer le traitement des données
public void initQuery() {
synchronized(lock) {
if (isTimeout() || latestRanking.size() <= 0) {
reload();
}
}
}
public Integer countLatestRanking() {
return latestRanking.size();
}
}
SampleRankingSingletonInitializerService ・ Généré automatiquement par DI
@Component
public class SampleRankingSingletonInitializerService {
@Autowired
private SampleMapper sampleMapper;
//Définissez le mappeur DI dans le service singleton lors de la génération de beans
@PostConstruct
public void init() {
SampleRankingSingletonService.INSTANCE.setSampleMapper(sampleMapper);
}
//Exécuter la première requête lors de la mise à jour du contexte(Spring Boot donne une erreur lors de l'exécution avec PostConstruct)
@EventListener
public void onContextRefreshedEvent(ContextRefreshedEvent evt) {
SampleRankingSingletonService.INSTANCE.initQuery();
}
public SampleMapper getSampleMapper() {
return sampleMapper;
}
public void setSampleMapper(SampleMapper sampleMapper) {
this.sampleMapper = sampleMapper;
}
}
<bean id="sample.sampleRankingSingletonInitializerService" class="org.sample.SampleRankingSingletonInitializerService">
<property name="sampleMapper" ref="sample.SampleMapper" />
</bean>
Ce n'est pas grave si vous définissez un point d'arrêt, arrêtez correctement après le démarrage du serveur et récupérez les données. Je vous remercie pour votre travail acharné!
Recommended Posts