Чтобы оптимизировать sql-запрос, я сделал службу, которая объединяет другие сервисы, чтобы избежать ненужных вызовов. (Некоторые страницы моего веб-приложение называется миллионы раз в день, поэтому я хочу, чтобы повторно использовать результаты запросов базы данных столько раз, сколько возможно по каждому запросу)Spring 4 @Service с @RequestScope
Решение создать этот один:
Мои служба @RequestScope вместо рамки по умолчанию (Singleton)
В MyService
@Service
@RequestScope
public MyService {
private int param;
@Autowired
private OtherService otherService;
@Autowired
private OtherService2 otherService2;
private List<Elements> elements;
private List<OtherElements> otherElements;
public void init(int param) {
this.param = param;
}
public List<Elements> getElements() {
if(this.elements == null) {
//Init elements
this.elements = otherService.getElements(param);
}
return this.elements;
}
public List<OtherElements> getOtherElements() {
if(this.otherElements == null) {
//Init otherElements
this.otherElements = otherService2.getOtherElements(param);
}
return this.otherElements;
}
public String getMainTextPres() {
//Need to use lElements;
List<Elements> elts = this.getElements();
....
return myString;
}
public String getSecondTextPres() {
//Need to use lElements;
List<Elements> elts = this.getElements();
//Also Need to use lElements;
List<OtherElements> otherElts = this.getOtherElements();
....
return myString;
}
}
В мой контроллер:
public class myController {
@Autowired MyService myService;
@RequestMapping...
public ModelAndView myFunction(int param) {
myService.init(param);
String mainTextPres = myService.getMainTextPres();
String secondTextPres = myService.getSecondTextPres();
}
@OtherRequestMapping...
public ModelAndView myFunction(int param) {
myService.init(param);
String secondTextPres = myService.getSecondTextPres();
}
}
Конечно, я упростил свой пример, потому что использование MYSERVICE много других элементов, и я защищать инициализацию членов его атрибутов
Этот метод имеет то преимущество, что делает отложенную загрузку атрибутов только тогда, когда я нужно их. Если где-то в моем проекте (в том же или другом контроллере) мне нужен только SecondTextPres, тогда вызов «getSecondTextPres» будет инициализировать оба списка, которые не имеют места в моем примере, потому что первый список был инициализирован при вызове «getMainTextPres».
Мой вопрос являются:
- Что вы думаете об этом способ делать вещи?
- Могу ли я иметь проблемы с производительностью, потому что я выполняю свою службу по каждому запросу?
Большое спасибо!
Julien
И почему это было бы оптимизировано с использованием компонента с запросом. Каждый запрос имеет свой собственный экземпляр, в нем нет ничего повторного использования. Если вы действительно хотите оптимизировать исправление своих запросов или использовать кеш. Я предлагаю изучить, что Spring может сделать для вас (и как вы можете кэшировать результаты) вместо того, чтобы пытаться взломать что-то вместе. –
Он оптимизирован, потому что один и тот же запрос я использую несколько раз с той же информацией низкого уровня, и этот способ делать вещи помогает мне повторно использовать данные, которые у меня уже есть на уровне обслуживания. Я не намерен оптимизировать его по двум запросам на разные запросы –
Если вам нужна такая оптимизация в одном запросе, возможно, вам придется пересмотреть свой поток. В запросе проконсультируется только один контроллер, все остальное - новый запрос. Судя по вашему описанию, кажется, что вы пытаетесь оптимизировать то, что вы даже не измеряли, или это действительно проблема. Похоже, вы пытаетесь оптимизировать вещи, которые даже не нуждаются в оптимизации. Помните: * преждевременная оптимизация - это корень всего зла *. Вместо того, чтобы вводить области видимости, есть, вероятно, лучшие (и более простые?) Способы улучшить ситуацию. Но сначала измерьте, измерьте, измерьте. –