Jakarta ee J2EE-JPA-EJB3-MDB方法中的事务
我在JBoss 5.1.0上部署了资源本地数据源(Oracle9i):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
<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