Frage

Ich führe eine Anwendung mit den folgenden Komponenten aus:

  • Oracle 9i
  • War 6.1.0.23 mit WS- und EJB3 -Features -Packungen
  • JPA mit Hibernate 3.3.2.ga als Anbieter (mit Hibernate-enttityManager 3.4.0)
  • Spring Transaction Manager für: UowtransactionManager (Frühjahr 2.5.6)
  • Spring Webflow mit fließender Persistenz (2.0.8), dh der Entitätsmanager wird in die HTTP-Sitzung serialisiert und auf jeder Anfrage wiederhergestellt.

In jeder Anfrage, die vom Webcontroller zur Serviceschicht wechselt (mit der @Transactional von Spring kommentiert), habe ich festgestellt Der Hibernate -ConnectionProvider, bis die Datenquelle keine kostenlosen Verbindungen mehr hat und schließlich hängt.

Hier sind Teile der Konfiguration:

  1. Frühling:

    <tx:annotation-driven />
    <context:component-scan base-package="org.home.myapp" />
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/DS" resource-ref="true"/>
    <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
    <bean id="EMF" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
      </property>
    </bean>
    
  2. Persistenz.xml

    <persistence-unit name="persistence" transaction-type="JTA">
      <properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
        <property name="hibernate.current_session_context_class" value="jta"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.default_batch_fetch_size" value="20"/>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>   
      </properties>
    </persistence-unit>
    
  3. Service

    @Transactional(readOnly=true) @Service
    public class MyServiceImpl implements MyService {
      @Autowired MyDao dao;
      public void getSomething() {
        dao.findSomething();
      }
    }
    
  4. Dao

    @Repository
    public class MyDaoJap implements MyDao {
      @PersistenceContext EntityManager em;
      public void findSomething() {
        em.find(...);
      }
    }
    

Beachten Sie, dass die Transaktion nur schreibgeschützt ist, was für die Durchfluss-Persistenz normal ist: Nur der letzte Übergang (mit Commit = true) ruft eine nicht gelesene Transaktionsmethode auf. Das Einschalten des Readonly -Flags verwandelt automatisch den Hibernate -Flush -Modus in manuell.

Während des Debugs bemerkte ich Folgendes:

  • Der UOW -Transaktionsmanager wird in der Abfangen -Kette des Dienstes korrekt aufgerufen, was darauf hindeutet, dass eine Transaktion aktiv ist
  • Hibernate fragt nach einer Verbindung, indem Sie DataSource.getConnection () auf der Rohdatenquelle aufrufen, die in die EMF injiziert wird. Die Strategie zum Erhalten einer Verbindung stammt aus dem injizierten Hibernate -InjizedDataSourceConnectionProvider, und diese Klasse verweist auf die DataSource (kein Proxy, der sich einer aktiven Transaktion oder dergleichen bewusst ist).

Ich denke, das Problem liegt in diesem zweiten Punkt, aber ich kann keinen Fehler in meiner Konfiguration finden. Kann jemand helfen?

Danke für Ihre Hilfe.

War es hilfreich?

Lösung

Einige wilde Vermutungen aus unserer Konfiguration

  • hibernate prop - hibernate.connection.release_mode = After_Statement
  • web.xml Resource Ref DataSource -Konfiguration -u003Cres-sharing-scope> Freiwilligu003C/res-sharing-scope>
  • Spring SessionFactory config - UsetransactionAwaredataSource = "True"

Es könnte sogar ein Konfigurationsproblem im Inneren sein

Andere Tipps

Ich denke (und hoffe), dass Ihre Probleme darauf zurückzuführen sind, dass sie durch die Verwendung der DataSource -Eigenschaft eine "Nicht -JTAdataSource" standardmäßig standhält. Die Standardkonfiguration (einfache) ist für Transaktionssysteme mit niedrigerem Grad (Tomcat/SE) und nicht für den Hardcore -Stack, den Sie verwenden, wirklich optimiert.

Sie müssen die Entity Manager -Fabrik so konfigurieren, dass sie eine JTA -Datenquelle haben. Die Art und Weise, wie ich dies tat, ist, meinen eigenen JtapersistenceUnitpostProcessor zu erstellen, in dem ich dies einrichten konnte.

Auf diese Weise konnte ich die EMF so festlegen, dass sie eine jtadataSource verwenden, ich bin mir nicht sicher, ob es eine bessere Möglichkeit gibt, dies zu tun. Sie könnten einfach, als POC die JTA -Datenquelle auf Ihre Persistenz hinzufügen.xml hinzufügen.

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