Ich habe Dynamic DataSource Routing für Spring+Hibernate gemäß dieser Artikel . Ich habe mehrere Datenbanken mit derselben Struktur, und ich muss auswählen, welche Datenbank jede spezifische Abfrage ausführen soll.
Alles funktioniert gut auf localhost, aber ich bin besorgt darüber, wie dies in realen Website-Umgebung halten wird. Sie verwenden einige statische Kontext Halter zu bestimmen, welche Datenquelle zu verwenden:
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();
}
}
Es ist in einen ThreadLocal-Container verpackt, aber was bedeutet das genau? Was wird passieren, wenn zwei Webanfragen dieses Stück Code parallel aufrufen?
CustomerContextHolder.setCustomerType(CustomerType.GOLD);
//<another user will switch customer type here to CustomerType.SILVER in another request>
List<Item> goldItems = catalog.getItems();
Wird in Spring MVC jede Webanforderung in einen eigenen Thread verpackt? Wird CustomerContextHolder.setCustomerType()
Änderungen für andere Webnutzer sichtbar sein? Meine Controller haben synchronizeOnSession=true
.
Wie kann ich sicherstellen, dass niemand sonst die Datenquelle wechselt, bis ich die erforderliche Abfrage für den aktuellen Benutzer ausführe?
Merci.