Рассмотрим я следующей весной бобыPropagate весной сделка двойников называют
CompositeService:
@Service
public class CompositeService {
@Resource
private ServiceA serviceA;
@Resource
private ServiceB serviceB;
public ResultBean compositeMethod() {
ResultBean result = new ResultBean();
result.setA(serviceA.getA());
result.setB(serviceB.getB());
return result;
}
}
ServiceA:
@Service
public class ServiceA {
@Transactional
@Cacheable
A getA() {
// calls DAO layer and makes a query to the database
}
}
ServiceB:
@Service
public class ServiceB {
@Transactional
@Cacheable
B getB() {
// calls DAO layer and makes a query to the database
}
}
кэшируемым аспект имеет более высокий порядок
Проблема с этим кодом является то, что он начнет две операции (и принять два соединения из пула) в случае кэш-промаха в обеих службах. Могу ли я настроить Spring для использования той же транзакции в этом случае? I.E. распространять транзакцию от ServiceA до CompositeService и после этого до ServiceB?
Я не могу установить CompositeService в транзакционных, потому что я не хочу, чтобы начать транзакцию (и заимствовать соединение с бассейном) в случае кэш-хит как в ServiceA и ServiceB
Он будет работать только в том случае, если метод включения (в 'CompositeService') является транзакционным. Почему было бы проблемой проверить соединение на пару миллисекунд, если это то, о чем вас беспокоит ИМХО, вы беспокоитесь о неправильных вещах. –
@ M.Deinum в моем конкретном случае база данных развернута в центре обработки данных в другом регионе с задержкой в 300 мс между Java-приложением и базой данных – bedrin
Итак? У вас есть пул соединений, поэтому соединения уже существуют. Единственное, что происходит, - это подключение, извлеченное из пула. Ничего больше. Это должно просто взять ~ 1 мс ... –