Spring entityManagerFactory abhängig von Parameter

torax13

Erfahrenes Mitglied
Wie ich ja schon hier [1] geschrieben hab, deploye ich im Moment 6 wars, die bis auf die verwendete persistenceUnit gleich sind.

[1] http://www.tutorials.de/forum/java/341057-war-deployment.html

Ich habe also 6 verschiedene PersistenceUnits definiert und lasse durch maven beim bauen des war nur den Parameter in der applicationContext.xml setzen.

Das sieht dann so aus:

Code:
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="alpha" />
	</bean>

Spring injeziert mir dann einen passenden EM. (ich gestehe mir das aus einem Beispiel geborgt zu haben. Meine Spring Kenntnisse sind noch fast 0).

Nun würd ich gern nicht 6 mal die identische Anwendung laden, sondern nur 1mal. Dazu müßt ich aber einen Weg finden Spring bei jedem Request die persistenceUnitName dynamisch zu übergeben (steht letztlich in derf URL)

Irgendwelche Hinweise? Ich weiß nicht mal, wonach ich google müßte :(
 
Hm, du willst also je nach Benutzer auf eine andere Datenbank, richtig? Konfigurierst du die DataSource momentan in der persistence.xml? Günstiger wärs, du konfigurierst die alle als Springbeans und benutzt dann eine DelegatingDataSource, überschreibst getTargetDataSource() und machst darin einen Lookup, welcher User gerade eingeloggt ist und gibst die zurück, die benutzt werden soll.

Gruß
Ollie
 
Nicht per User, sondern per Request. Aber das sollte vom Konzept her nicht den riesen Unterschied machen.

Wenn ich das richtig verstehe (den Teil hab ich mir einfach aus dem Apache Wicket Wiki kopiert.. ich wollt nicht auch nocht Spring lernen..) dann verwendet ich den openEntityManagerInViewFilter, welcher mir per Request einen EntityManager bereitstellt.

asu der web.xml:
Code:
<filter>
	<filter-name>openEntityManagerInViewFilter</filter-name>
	<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
	</filter>

Dieser sorgt dafür, das ich in meinen Beans dann einen passenden EM bekomme:

aus einer Bean:
Code:
@PersistenceContext
	public void setEntityManager(final EntityManager entityManager) {
		this.entityManager = entityManager;
	}

Was ich nun möchte, ist nicht die zu verwendende persistenceUnit schon in der Config festzuschreiben, sondern 'irgendwo' (werd ich wohl in einem Filter machen müssen?) aus der URL abzuleiten.

Danke schon mal für Deine Antwort, ich werd mir den Link von Dir mal zu genüte ziehen, vielleicht hilft mir das ja schon weiter...
 
Der Filter sorgt nur dafür, dass der EntityManager bereits beim Eintreten des Request aufgemacht wird und nicht erst beim Öffnen einer Transaktion. Wichtig ist das vor allem wenn du Objekte in JSPs traversieren willst. Da hast du ohne den Filter bereits ein detachtes Objekt und bekommst mit großer Wahrscheinlichkeit LazyLoadingExceptions.

Ich versteh ehrlich gesagt nicht ganz worauf du hinaus willst? Einfach blind pro Request auf eine andere Datenbank zu gehen halte ich für unüblich. Du hast doch hoffentlich nicht vor sowas wie Clustering selber zu schreiben?

Was ist denn genau das Auswahlkriterium das zwischen den einzelnen Datenbanken entscheidet?

Gruß
Ollie
 
Letztlich hab ich die gleiche Anwendung mehrfach, nur die Daten unterscheiden sich.

Es geht um folgende Anwendung (ein kleines Projekt, um mich mal wieder fit zu machen in Sachen Web / JPA / Spring)

http://faboo.org/eddie/

Als ich anfing, wollt ich das nur einen Gameserver machen, nu aber auf Anfrage der Player dort auf für die anderen Gameserver.

Daher ist die Datenbank nicht darauf eingestellt die Daten für mehere Server zu halten und ich hab einfach je Server ein eigenes Schema/User angelegt.

Geht ja auch soweit, nur wird mir das langsam lästig bei jedem Deployment je Server nen eigenes war zu bauen und der Speicherbedarf (PermGen) ist auch nicht ohne.

Da letztlich in der Url drin steht, für welchen Server die Daten angefordert werden sollen, dacht ich halt das jeweils dynamisch zu switchen. Letzlich stellt mir der OpenSessionInViewFilter ja auch je Request einen EM (und bei Bedarf eine Transaction) zur Verfügung. Nur leider ist die zu verwendende EMFBean fest in der config verdrahtet..

Ich hab auch mal im Spring Forum nachgefragt:

http://forum.springsource.org/showthread.php?t=72573

Ich weiß, das ich da noch am Ende bin, ich muss dann auch noch die Sessions/Auth trennen, aber das denke ich hinzubekommen.

Danke jedenfalls für Deine Zeit
 
Also ist ein Teil der URL ausschlaggebend dafür, welche DB verwendet werden soll, richtig?

Dann würde ich mir einen Spring MVC Filter schreiben, der die URL an nen ThreadLocal klemmt und den man dann von deiner DelegatingDataSource Subklasse fragen kann über welche URL denn der Request des gerade ebene laufenden Thread kam...

Gruß
Ollie
 
Ohje, Du wirfst mit Begriffen rum ;)

ich werd mich mal hinsetzen und nachlesen. Hab bisher Spring bewußt rausgelassen in meiner Lernerei, da ich genug mit JPA/Hibernate Wicket und html/css zu tun hatte und es ja mit der Konfiguratio die ich aus dem Wicket Wiki hatte lief.

Nun werd ich wohl nicht drum rum kommen auch weiter in Spring einzusteigen.

Gruß Bert

PS: ich hab mir erlaubt Dich auf Xing anzuschreiben, ich hoff das war ok.
 

Neue Beiträge

Zurück