【问题标题】:rollback with mulitple entity manager in java ee在 java ee 中使用多个实体管理器回滚
【发布时间】:2015-05-05 09:18:23
【问题描述】:

在一个带有 JBoss Application Server 7 和容器管理事务的 Web 应用程序中,我有 2 个持久性单元,一个用于 Oracle,一个用于 PostgreSQL。然后我在一个类中注入两个实体管理器。

在此类同时使用这些实体管理器的方法中,当抛出导致回滚的运行时异常时,只有Oracle数据会回滚。

我做错了什么?

【问题讨论】:

  • 欢迎来到 SO!请发帖SSCCE 让我们帮忙。
  • 格式化、大写

标签: jakarta-ee jboss transactions entitymanager rollback


【解决方案1】:

你需要使用一个复合持久化单元来连接更多的数据库。一个复合持久性单元包含更多复合单元成员。一个这样的复合持久性单元 member 与每个数据库相关联。所有复合持久性单元成员都加入到一个(整体)复合持久性单元中。这个复合单元在 Java 中链接到一个 @PersistenceContext。它根据一个 XA 事务运行。

在详细的答案Composite Persistence Unit solution 中,我解释了如何配置两个持久性单元成员。每个复合持久性单元成员都与不同的数据库连接。您可以使用 EclipseLink 配置复合持久性单元:CompositePersistenceUnits in EclipseLink

【讨论】:

    【解决方案2】:

    寻找两阶段交易。

    您应该为 XA 事务准备数据库。

    以 PostgreSQL 为例,设置参数max_prepared_transactions 为 10。

    对于 Oracle 9.2/10 授予用户权限:

    grant select on sys.dba_pending_transactions to <user name>;
    grant select on sys.pending_trans$ to <user name>;
    grant select on sys.dba_2pc_pending to <user name>;
    grant execute on sys.dbms_system to <user name>;
    

    您应该在 JBoss 中创建 XA 数据源。我的示例(为您的数据库进行更改)

    PostgreSQL:

            <driver name="postgresql-xa" module="org.postgresql">
                <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
            </driver>
    
                <xa-datasource jndi-name="java:jboss/datasources/MoneyXADS" pool-name="MoneyXADS" enabled="true" use-ccm="false">
                    <xa-datasource-property name="ServerName">
                        127.0.0.1
                    </xa-datasource-property>
                    <xa-datasource-property name="PortNumber">
                        5432
                    </xa-datasource-property>
                    <xa-datasource-property name="DatabaseName">
                        money
                    </xa-datasource-property>
                    <driver>postgresql-xa</driver>
                    <xa-pool>
                        <is-same-rm-override>false</is-same-rm-override>
                        <interleaving>false</interleaving>
                        <pad-xid>false</pad-xid>
                        <wrap-xa-resource>false</wrap-xa-resource>
                    </xa-pool>
                    <security>
                        <user-name>wassily</user-name>
                        <password>leontief</password>
                    </security>
                    <validation>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </xa-datasource>
    

    甲骨文:

            <driver name="oracle-xa" module="com.oracle.db">
                <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
            </driver>
    
                <xa-datasource jndi-name="java:jboss/datasources/CACCXADS" pool-name="CACCXADS" enabled="true" use-ccm="false">
                    <xa-datasource-property name="URL">
                        jdbc:oracle:thin:@localhost:1521:XE
                    </xa-datasource-property>
                    <xa-datasource-property name="User">
                        DEV_CACC
                    </xa-datasource-property>
                    <xa-datasource-property name="Password">
                        DEV_CACC
                    </xa-datasource-property>
                    <driver>oracle-xa</driver>
                    <xa-pool>
                        <is-same-rm-override>false</is-same-rm-override>
                        <interleaving>false</interleaving>
                        <pad-xid>false</pad-xid>
                        <wrap-xa-resource>false</wrap-xa-resource>
                    </xa-pool>
                    <validation>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </xa-datasource>
    

    【讨论】:

    • 感谢回复,我使用 jta 交易。可以通过jta交易做比吗?
    • 是的,你可以。只需设置 xa 数据源。
    猜你喜欢
    • 2011-11-23
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2020-09-18
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多