Frage

Normalerweise

wenn ein DAO definiert, müßten Sie einen Setter für die Datenquelle auf dem DAO-Objekt. Mein Problem ist, dass unsere Datenquelle dynamisch auf der Basis der Anfrage an den Server ändert. das heißt jede Anforderung können unterschiedliche Datenbankinstanz zugreifen.

Die Anforderung hält logische Eigenschaften, die später verwendet werden können, um die Verbindung zum DB der Anforderung abgerufen werden.

Also, wenn die Abhängigkeit der DAO in die Business-Logik Objekt Injektion ich einen Weg benötigen (Konfiguration keine Zeit) die Eigenschaften auf der DAO zur Laufzeit festgelegt.

Eine Lösung ist die Datenquelle auf dem lokalen Thread zu speichern, aber ich weiß nicht wirklich mit Gewinden lokalen Variablen wie Messing.

Eine andere Möglichkeit ist es, eine Methode initialize auf der Business-Logik-Objekt zu haben, die mit den Anforderungseigenschaften auf der DAO Anrufe initialisieren.

Ich denke, es ist ein weit verbreitetes Problem, können Sie eine gemeinsame Lösung vorschlagen?

War es hilfreich?

Lösung

Es klingt wie Ihr Problem ist, dass Sie eine einzelne DAO-Instanz für Ihre Anwendung erstellen. Sie müssen entweder eine separate Instanz für jede Datenquelle erstellen (vielleicht eine Art von dao-Controller macht das alles für Sie zu verwalten) oder möglicherweise Ihre Methoden in Ihrem dao lassen statisch sein und übergeben Sie alle Informationen darüber, wie Sie die Datenquelle verbinden zusammen mit die Daten, die Sie in jeder Methode sind persistierende.

Andere Tipps

Ihr Problem ist ein wenig verwirrend. ein DAO Zugriff auf mehrere unterschiedliche Datenquellen zu haben scheint, eine Wartung Alptraum. Als Ergebnis sollten Sie eine DAO-Schnittstelle enthält alle Methoden definieren, die Sie anrufen wollen. Für jede Datenbank verbinden Sie mir eine neue Klasse geschaffen hat, dass Ihr DAO-Schnittstelle implementiert. Auf diese Weise können Sie mehrere Implementierungen haben. Ich würde dann speichern Sie diese Implementierungen (je, das seine eigene Datenquelle hat) in einer Karte (java.util.Map), Ihre „logischen Eigenschaften“ als Schlüssel für die Karte. Da alle Ihre DAO Implementations Ihre Schnittstelle implementieren können Sie sie an die Schnittstelle werfen und sie austauschbar verwendet werden. Auf dem Business-Objekt, würden Sie die Karte von DAO-Implementierungen injizieren. Ich hoffe, das hilft Ihr Design.

Sie möchten in dieser Klasse aussehen:

http: //static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

Das macht es einfacher für Ihre Serviceobjekte und Datenzugriffsobjekte unwissend sein, dass jeder Begriff der dynamischen Datenquellen vorhanden ist.

Normalerweise müssten Sie einen Servlet-Filter implementieren und einen Thread verwenden, so dass die DataSourceLookup Implementierung von AbstractRoutingDataSource verwendet leicht Zugriff auf die Anforderungsparameter gewinnen können, die bestimmen, welche Datasource zurückgegeben. Wenn Sie wirklich, dass vermeiden möchten, können Sie einen Servlet-Filter implementieren, die Eigenschaften auf einer Anfrage-scoped Bean setzt und injizieren die Bohne in die DataSourceLookup Implementierung haben Sie geschrieben. Anfrage-scoped Bohnen verwenden immer noch eine Thread in ihrer Umsetzung aber zumindest diese Art und Weise ist es Spring impl, nicht verkaufen, und Sie brauchen sich nicht darum zu kümmern. :)

ähnlicher Ansatz wird in diesem Blog-Eintrag aus dem Frühjahr-Team erläutert:

http://blog.springsource.com/2007/01 / 23 / dynamic-Datenquelle-Routing /

Ich hatte ein solches Problem auf einem Client / Server-Projekt. Client- und Server-Projekte teilen Dao-Schnittstellen. Und wenn ich verwendete Datenbankoperation zu tun hatte ich geeignete Dao Implementierung auszuwählen. Meine Lösung wie diese war:

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

Get dao von der Fabrik von parameters.Inside Dao Fabrik entscheiden vorbei, der Dao Umsetzung .. zurück

Ich habe bereits. Sie benötigen einen DAO jede Klasse, und im Rahmen Ihrer DAO erstellen müssen Sie die Datenquelle zu übergeben und schließlich eine Klasse Controller, auf die dynamische Berufung DAO tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top