4 Stimmen

Wie kann man häufige DataSource-Wechsel für AbstractRoutingDataSource sicher gestalten?

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.

6voto

Pascal Thivent Punkte 548176

Wird in Spring MVC jede Webanforderung in einen eigenen Thread verpackt?

Ja, aber das hat nichts mit Spring MVC zu tun, das macht der Container (der Container hat einen Threadpool und wählt einen davon aus, um jede Anfrage zu bearbeiten).

Werden die Änderungen in CustomerContextHolder.setCustomerType() für andere Webbenutzer sichtbar sein?

Nr. A ThreadLocal ist per Definition lokal für einen Thread. Aus der Javadoc:

Diese Klasse stellt thread-lokale Variablen zur Verfügung. Diese Variablen unterscheiden sich von ihren normalen Gegenstücken dadurch, dass jeder Thread, der auf eine Variable zugreift (über seine get o set Methode) hat ihre eigene, unabhängig initialisierte Kopie der Variablen. ThreadLocal Instanzen sind typischerweise private statische Felder in Klassen, die einen Zustand mit einem Thread assoziieren wollen (z.B. eine Benutzer-ID oder Transaktions-ID).

Was Sie set in einem ThreadLocal ist für andere Threads nicht sichtbar. Sie sollten in Ordnung sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X