・ 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