【发布时间】:2014-02-18 22:55:13
【问题描述】:
不确定是否有人遇到过这个问题。我正在使用带有 EJB3.1 的 Jboss7.1 应用程序服务器和带有 Hibernate 实现的 JPA2.0。我正在使用后端 Oracle 11g 数据库。请看下面的代码。我正在使用由 HTTP GET 请求驱动的 servlet 调用我的 EJB。
当我在下面的代码中注释掉context.setRollbackOnly() 时,我的网页会永远挂起,一段时间后我会低于堆栈跟踪(如果我调试,它需要我直到 persist() 方法,然后什么也没有)。
21:56:22,765 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffffc0a80005:57a36cd7:5303d0bf:30 in state RUN 21:56:22,767 WARN [com.arjuna.ats.arjuna](Transaction Reaper Worker 2)ARJUNA012095:中止操作 id 0:ffffc0a80005:57a36cd7:5303d0bf:30 在其中多个线程处于活动状态时被调用。 21:56:22,768 WARN [com.arjuna.ats.arjuna](事务收割工人 2)ARJUNA012108:CheckedAction::check - 原子动作 0:ffffc0a80005:57a36cd7:5303d0bf:30 中止,有 1 个线程处于活动状态! 21:56:23,266 WARN [com.arjuna.ats.arjuna](事务收割机)ARJUNA012117:TransactionReaper::检查 TX 0 的超时:ffffc0a80005:57a36cd7:5303d0bf:30 处于取消状态 21:56:23,767 WARN [com.arjuna.ats.arjuna](事务收割机)ARJUNA012117:TransactionReaper::check timeout for TX 0:ffffc0a80005:57a36cd7:5303d0bf:30 in state CANCEL_INTERRUPTED 21:56:23,768 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012120: TransactionReaper::check worker Thread[Transaction Reaper Worker 2,5,main] 在取消 TX 0:ffffc0a80005:57a36cd7 时没有响应中断: 5303d0bf:30 -- 工人标记为僵尸和 TX 计划标记为回滚 21:56:23,770 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012110: TransactionReaper::check 成功将 TX 0:ffffc0a80005:57a36cd7:5303d0bf:30 标记为仅回滚
context.setRollbackOnly() 未注释,然后页面加载,但后端表中没有记录。相同的代码间歇性地工作。我无法弄清楚它何时起作用的实际模式!有没有人可以点灯?
我的 EJB 代码如下 -
import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Local;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Local(DepartmentLocal.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@DeclareRoles({"Admin", "Guest"})
public class DepartmentBean{
@Resource
private SessionContext context;
@PersistenceContext(unitName="department-pu")
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@RolesAllowed({"Admin"})
public long addDepartment(Department dep){
em.persist(dep);
//context.setRollbackOnly();
return dep.getDepartmentId();
}
}
更新:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="DEPARTMENTS")
public class Department {
@Id
@Column(name="DEPARTMENT_ID")
private long departmentId;
@Column(name="DEPARTMENT_NAME")
private String departmentName;
@Column(name="MANAGER_ID")
private long managerId;
@Column(name="LOCATION_ID")
private long locationId;
public long getDepartmentId() {
return departmentId;
}
public void setDepartmentId(long departmentId) {
this.departmentId = departmentId;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public long getManagerId() {
return managerId;
}
public void setManagerId(long managerId) {
this.managerId = managerId;
}
public long getLocationId() {
return locationId;
}
public void setLocationId(long locationId) {
this.locationId = locationId;
}
}
META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_2_0.xsd"
version="2.0">
<persistence-unit name="department-pu" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/OracleDS</jta-data-source>
<class>Department</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="show_sql" value="false"/>
</properties>
</persistence-unit>
在standalone-full.xml中
<datasources>
...
<datasource jta="true" jndi-name="java:jboss/datasources/OracleDS" pool-name="OjdbcPool" enabled="true" use-java-context="true">
<connection-url>jdbc:oracle:thin:@localhost:1521:xe</connection-url>
<driver>ojdbc</driver>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>xxx</user-name>
<password>xxx</password>
</security>
</datasource>
<drivers>
<driver name="ojdbc" module="oracle.jdbc">
<xa-datasource-class>oracle.jdbc.OracleDriver</xa-datasource-class>
</driver>
</drivers>
</datasources>
【问题讨论】:
标签: hibernate jakarta-ee jpa transactions ejb-3.1