2016-05-12 3 views
0

Ich benutze Hibernate 4.2 und arbeite an J2ee6 mit Tomee 1.7.4. Ich muss Multi-Tenant-Code schreiben, der bei Bedarf auf verschiedene Datenbanken zugreifen kann. Ich habe das versucht, indem ich mehrere persistence units in persistence.xml erstellt habe, aber während des Serverstarts versucht tomee die Verbindung zu allen persistenten Einheiten zu validieren (alle sind möglicherweise während des Tests nicht verfügbar).JPA ehrt das Caching nicht, während Entity Manager Factory dynamisch erstellt wird

Ich habe versucht, eine Einstellung zu finden, die Tomee sagt, die Validierung der Verbindungen beim Start zu überspringen, konnte aber keine finden. Anstatt also EntityManager von Persistenzeinheit zu schaffen, begann ich die Funktion

javax.persistence.Persistence.createEntityManagerFactory(String persistenceUnitName, Map properties) 

und meine Hartnäckigkeit XML hat alle Eigenschaften nicht hatte. Dies half mir, dieses Problem zu lösen, aber mein Caching funktionierte nicht mehr, als ich zu diesem Modell wechselte, es funktionierte vorher.

Kann jemand eine Art und Weise vorschlagen, in der ich Tomee bitten kann, Persistenzeinheiten beim Start zu ignorieren, oder ich kann Caching auf die andere Weise aktivieren, die ich gefunden habe.

Meine bisherigen persistence.xml sah aus wie

<?xml version="1.0" encoding="UTF-8" ?><persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
<persistence-unit name="localDB" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
    <properties> 
     <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> 
     <property name="hibernate.show_sql" value="false" /> 
     <property name="hibernate.format_sql" value="false" /> 

     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/xxxxxx?autoReconnect=true" /> 
     <property name="hibernate.connection.username" value="xxxxx" /> 
     <property name="hibernate.connection.password" value="xxxxx" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.c3p0.acquire_increment" value="1"/> 
     <property name="hibernate.c3p0.max_size" value="40"/> 
     <!-- it must be set to LESS than the wait_timout setting for the mysql server (this setting defaults to 28800 secs (8 hours)) --> 
     <property name="hibernate.c3p0.idle_test_period" value="28680" /> 
     <property name="hibernate.c3p0.preferredTestQuery" value="select 1;" /> 
     <property name="hibernate.c3p0.timeout" value="60000"/> 
     <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/> 
     <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces " value="true"/> 
     <property name="debugUnreturnedConnectionStackTraces " value="true"/> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.cache.region.factory_class" value="com.mc.hibernate.memcached.MemcachedRegionFactory" /> 
     <property name="hibernate.memcached.operationTimeout" value = "40000"/> 
     <property name="hibernate.memcached.connectionFactory" value = "KetamaConnectionFactory"/> 
     <property name="hibernate.memcached.hashAlgorithm" value = "HashAlgorithm.FNV1_64_HASH"/> 
     <property name="hibernate.memcached.servers" value = "xxxxx:xxxx"/> 

     <property name="hibernate.cache.region_prefix" value=""/> 
    </properties> 
</persistence-unit> 

<persistence-unit name="production" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
    <properties> 
     <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> 
     <property name="hibernate.show_sql" value="false" /> 
     <property name="hibernate.format_sql" value="false" /> 

     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.connection.url" value="jdbc:mysql://xxxxx:3306/thewalkindb?autoReconnect=true" /> 
     <property name="hibernate.connection.username" value="xxxx" /> 
     <property name="hibernate.connection.password" value="xxxxx" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.c3p0.acquire_increment" value="1"/> 
     <property name="hibernate.c3p0.max_size" value="15"/> 
     <!-- it must be set to LESS than the wait_timout setting for the mysql server (this setting defaults to 28800 secs (8 hours)) --> 
     <property name="hibernate.c3p0.idle_test_period" value="28680" /> 
     <property name="hibernate.c3p0.preferredTestQuery" value="select 1;" /> 
     <property name="hibernate.c3p0.timeout" value="60000"/> 
     <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/> 
     <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces " value="true"/> 
     <property name="debugUnreturnedConnectionStackTraces " value="true"/> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.cache.region.factory_class" value="com.mc.hibernate.memcached.MemcachedRegionFactory" /> 
     <property name="hibernate.memcached.operationTimeout" value = "40000"/> 
     <property name="hibernate.memcached.connectionFactory" value = "KetamaConnectionFactory"/> 
     <property name="hibernate.memcached.hashAlgorithm" value = "HashAlgorithm.FNV1_64_HASH"/> 
     <property name="hibernate.memcached.servers" value = "xxxxxxxx"/> 

     <property name="hibernate.cache.region_prefix" value=""/> 
    </properties> 
</persistence-unit> 

dies mit Caching funktioniert, aber es doesnot gibt mir Flexibilität Validierung bei tomee Start

Meine neue Persistenz xml zu überspringen, die nicht der Fall ist Ehrungen Caching, aber erlaubt mir die Flexibilität ist wie folgt

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
<persistence-unit name="localDB" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
    <properties></properties> 
</persistence-unit> 

<persistence-unit name="production" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
    <properties> 
    </properties> 
</persistence-unit> 

Ich beziehe alle Eigenschaften in einer Map und rufe die Funktion javax.persistence.Persistence.createEntityManagerFactory (String persistenceUnitName, Map properties) auf, aber irgendwie wird Caching nicht berücksichtigt.

Antwort

0

Ich bekomme keine Verbindung zwischen Validierung und Caching. Wenn Sie eine Fassade für den Entity Manager-Mandanten erstellen, wissen Sie, dass Sie nur einen Cache pro Entitätsmanager haben, was bedeutet, dass Sie den lokalen Cache für die Produktionspersistenzeinheit nicht überprüfen.

Wenn Sie einen einzigen Entity-Manager wollen - = Sie erhalten einen einzigen JPA-Cache in diesem Modus, der lokale und Produktion zusammenführen wird - können Sie dynamisches Routing verwenden: http://tomee.apache.org/examples-trunk/dynamic-datasource-routing/README.html anstelle von dynamischen Persistenz-Einheiten.

+0

Meine persistence.xml hat 3 Persistenzeinheiten mit drei verschiedenen jdbc-URLs, während meiner Entwicklung kann ich keine Verbindung zu prod herstellen, und während prod kann ich keine Verbindung zum dev-Server herstellen. Derzeit sind alle URLs in Persistenz-XML definiert, aber ich verwende nur die entsprechende Persistenzeinheit im Code. Tomee versucht während des Startvorgangs, sich mit allen Persistenzeinheiten zu verbinden, weshalb ich jedes Mal die Persistenz xml ändern muss. Mein Hauptziel ist es, dieselbe Persistenz xml zu haben, aber tomee sollte nicht standardmäßig mit – vishva

+0

in conf/system.properties verbinden, die Sie setzen können: PERSISTENCEUNIT.theUnitName.thePropertyName = thePropertyValue –

Verwandte Themen