Я реализовал динамическую маршрутизацию источника данных для Spring + Hibernate в соответствии с этой статьей .У меня есть несколько баз данных с одинаковой структурой, и мне нужно выбрать, какая БД будет выполнять каждый конкретный запрос.
Все отлично работает на localhost, но я беспокоюсь о том, как это будет действовать в реальной среде веб-сайта.Они используют некоторый статический держатель контекста, чтобы определить, какой источник данных использовать:
public class CustomerContextHolder {
private static final ThreadLocal<CustomerType> contextHolder =
new ThreadLocal<CustomerType>();
public static void setCustomerType(CustomerType customerType) {
Assert.notNull(customerType, "customerType cannot be null");
contextHolder.set(customerType);
}
public static CustomerType getCustomerType() {
return (CustomerType) contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
Он заключен в некоторый контейнер ThreadLocal, но что именно это означает?Что произойдет, когда два веб-запроса вызывают этот фрагмент кода параллельно:
CustomerContextHolder.setCustomerType(CustomerType.GOLD);
//<another user will switch customer type here to CustomerType.SILVER in another request>
List<Item> goldItems = catalog.getItems();
Каждый веб-запрос упакован в свой собственный поток в Spring MVC?Будут ли изменения CustomerContextHolder.setCustomerType()
видны другим пользователям сети?У моих контроллеров есть synchronizeOnSession=true
.
Как сделать так, чтобы никто больше не переключал источник данных, пока я не выполню требуемый запрос для текущего пользователя?
Спасибо.