Frühjahr: HibernateTransactionManager Umgang mit mehreren Datenquellen

In das folgende Stück code (Feder 3):

@Transactional("txManager")
public class DaoHolder {

    @Transactional(value="txManager", readOnly=false, propagation=Propagation.REQUIRES_NEW, rollbackFor={Exception.class})
    private void runTransactionalMethod() throws Exception {
        dao1.insertRow();
        dao2.insertRow();
        //throw new Exception();
    }
    //...
}
  • dao1 verwendet ein session-factory befestigt datasource1
  • dao2 verwendet ein session-factory befestigt datasource2
  • txManager ist ein HibernateTransactionManager mit der gleichen session factory als dao1

Den code oben funktioniert korrekt in einer transaktionalen Weise - insbesondere, wenn keine Ausnahme geworfen wird, die einzelnen dao-Betrieb wird verpflichtet (zu 2 verschiedene datasources). Wenn eine Ausnahme geworfen wird jedes dao-operation wird rückgängig gemacht.

Meine Frage ist: warum funktioniert es? Überall wo ich gelesen habe, ich habe gesagt, die Verwendung einer JtaTransactionManager beim Umgang mit mehreren Datenquellen. Ich würde lieber nicht verwenden JTA. Was könnten die Folgen sein wenn ich lassen Sie es unter einem HibernateTransactionManager?



Einige weitere details für den interessierten:

Jede Datenquelle definiert ist, etwa so:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="initialSize" value="${jdbc.initial_size}" />
    <property name="maxActive" value="${jdbc.max_active}" />
</bean>

Jeder session factory ist definiert wie folgt:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
            ... multiple *.hbm.xml files here ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        </props>
    </property>
</bean>

Des Transaktions-MANAGERS definiert, wie so:

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Jede dao-Klasse extends HibernateDaoSupport und die Inhalte der insertRow-Methode ist mehr oder weniger wie so für dao1:

getHibernateTemplate().save(obj);

und für dao2:

getHibernateTemplate().merge(obj);
Können Sie anzeigen-code insertRow() und Konfiguration von session-Fabriken, Transaktions-Managern, etc?
Sicher, gerade Hinzugefügt 🙂
Sind Sie sicher, dass Ihre DAOs tatsächlich nutzen verschiedene Datenquellen? Es ist nicht klar, in der config die du gepostet.
Ja, ich bin mir 100% sicher. Nachdem der Vorgang abgeschlossen ist, habe ich eigentlich überprüfen der DBs für Ergebnisse, sodass für diese das problem zu sein, ich hätte zu schlechte Konfiguration UND schaut in die gleiche Datenbank. Die datasources sind zwei Postgres-DBs auf dem gleichen host.
Haben Sie versucht, Sie anzurufen, bündig an beiden Sitzungen vor dem werfen der exception?

InformationsquelleAutor machinery | 2012-01-02

Schreibe einen Kommentar