Jakarta ee J2EE-JPA-EJB3-MDB方法中的事务

Jakarta ee J2EE-JPA-EJB3-MDB方法中的事务,jakarta-ee,ejb,jboss5.x,jta,jboss-mdb,Jakarta Ee,Ejb,Jboss5.x,Jta,Jboss Mdb,我在JBoss 5.1.0上部署了资源本地数据源(Oracle9i): <datasources> <local-tx-datasource> <jndi-name>OracleDS</jndi-name> <connection-url>jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</connection-url> <driver-class>ora

我在JBoss 5.1.0上部署了资源本地数据源(Oracle9i):

<datasources>
  <local-tx-datasource>
    <jndi-name>OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>***</user-name>
    <password>***</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <metadata>
        <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

神谕
jdbc:oracle:thin:@IP_地址:1521:inv9i
oracle.jdbc.driver.OracleDriver
***
***
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
Oracle9i
持久性单位:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/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_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:OracleDS</non-jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
java:OracleDS
hr.bel.model.Instrument
hr.bel.model.Order
hr.bel.model.OrderAdditionalData
hr.bel.model.OrderCondition
hr.bel.model.Trade
hr.bel.model.TradeAdditionalData
hr.bel.model.Tradeticker
在MDB中,当调用onMessage方法时,我试图持久化一个bean,并通过namedQuery获取该类型的最新5个bean:

@PersistenceContext
    EntityManager em = null;
    public void onMessage(MyMessage msg) {
        Map message = msg.getMessageTree(false);
        Instrument instrument = em.find(Instrument.class, 55);      

        Tradeticker tt = createTradeticker(message);
        tt.setInstrument(instrument);

        log.info("Persisting tradeticker: " + tt.getTradeType());               
        em.persist(tt);             
        log.info("Tradeticker persisted...");

        List<Tradeticker> last5 = em.createNamedQuery("getLast5").setParameter(1,instrument.getInstrumentId()).setMaxResults(5).getResultList();
        log.info("Persisted tradetickers size: " + last5.size());
    }
@PersistenceContext
EntityManager em=null;
公共消息无效(MyMessage消息){
Map message=msg.getMessageTree(false);
仪器=em.find(仪器类别,55);
Tradeticker tt=createTradeticker(消息);
tt.设置仪表(仪表);
log.info(“持久化交易代码:+tt.getTradeType());
em.persist(tt);
log.info(“Tradeticker持久化…”);
List last5=em.createNamedQuery(“getLast5”).setParameter(1,instrument.getInstrumentId()).setMaxResults(5.getResultList();
log.info(“持久化tradetickers大小:+last5.size());
}
我的问题是没有任何错误跟踪,但Oracle数据库中仍然没有任何持久化对象。大量消息之后,调用
last5.size()
返回0。原木非常干净

我找到的MDB的唯一限制是我必须在方法上使用必需的或不受支持的事务属性。我的onMessage没有注释,因此它使用REQUIRED作为默认值。而且我在MDB类上没有任何注释,所以bean应该使用容器管理的事务


我做错了什么?

顺便说一句:一种常见的模式是将业务逻辑放入SLSB中,并从MDB调用它-允许逻辑的其他用途。但这对你的问题没有影响

我希望重新请求默认事务属性。我看不出这个失败的原因

我会做这些事情:

1) 。围绕业务逻辑进行尝试。是否抛出任何异常

2) 。删除查询,我看不出它为什么会失败,但是让我们删除它可能干扰插入的任何可能性。让我们依靠数据库。使用命令行SQL语句或其他实用程序,查看经过几条消息后数据库中的内容


3) 。再次检查日志,是否在任何地方出现错误?

顺便问一下:一种常见的模式是将业务逻辑放入SLSB中,并从MDB调用该逻辑-允许逻辑的其他用途。但这对你的问题没有影响

我希望重新请求默认事务属性。我看不出这个失败的原因

我会做这些事情:

1) 。围绕业务逻辑进行尝试。是否抛出任何异常

2) 。删除查询,我看不出它为什么会失败,但是让我们删除它可能干扰插入的任何可能性。让我们依靠数据库。使用命令行SQL语句或其他实用程序,查看经过几条消息后数据库中的内容


3) 。再次检查日志,是否在任何地方出现错误?

在使用非jta数据源时,您不应该自己管理事务吗?也就是说,获取事务并自己提交数据?我将这类内容留给JTA自己处理,但当我正确阅读时,您似乎需要明确提交。

在使用非JTA数据源时,您不应该自己管理事务吗?也就是说,获取事务并自己提交数据?我把这类事情留给JTA自己处理,但如果我读对了,你就需要明确地做出承诺。

好的。这就是我解决问题的方法,第一个是在persistence.xml中定义tx数据源,第二个是定义jta模型和jta数据源

新数据源定义:

<datasources>
  <xa-datasource>
    <jndi-name>OracleDS</jndi-name>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</xa-datasource-property>
    <xa-datasource-property name="User">***</xa-datasource-property>
    <xa-datasource-property name="Password">***</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <no-tx-separate-pools/>
    <metadata>
      <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </xa-datasource>

神谕
假的
oracle.jdbc.xa.client.oraclexadasource
jdbc:oracle:thin:@IP_地址:1521:inv9i
***
***
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
Oracle9i
jboss:service=TransactionManager

新建persistence.xml:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/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_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:OracleDS</jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
java:OracleDS
hr.bel.model.Instrument
hr.bel.model.Order
hr.bel.model.OrderAdditionalData
hr.bel.model.OrderCondition
hr.bel.model.Trade
hr.bel.model.TradeAdditionalData
hr.bel.model.Tradeticker
我的java代码是一样的,现在我得到了我的对象持久化!在与使用mysql dbms的同事讨论后,我们发现Oracle及其tx和no tx数据源对数据源的使用方式和位置进行了严格限制。
谢谢大家!

好的。这就是我解决问题的方法,第一个是在persistence.xml中定义tx数据源,第二个是定义jta模型和jta数据源

新数据源定义:

<datasources>
  <xa-datasource>
    <jndi-name>OracleDS</jndi-name>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</xa-datasource-property>
    <xa-datasource-property name="User">***</xa-datasource-property>
    <xa-datasource-property name="Password">***</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <no-tx-separate-pools/>
    <metadata>
      <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </xa-datasource>

神谕
假的
oracle.jdbc.xa.client.oraclexadasource
jdbc:oracle:thin:@IP_地址:1521:inv9i
***
***
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
Oracle9i
jboss:service=TransactionManager

新建persistence.xml:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/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_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:OracleDS</jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
java:OracleDS
hr.bel.model.Instrument
hr.bel.model.Order
hr.bel.model.Ord