有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)

我是J2EE新手,希望使用容器管理的事务。我的问题是,当我在一个长时间运行的任务中关闭服务器时,应该是事务性的,所有已经处理的数据都将提交。我做错了什么?这难道不应该倒退吗?看起来EntityManager会在服务器关闭时刷新所有内容,即使该功能尚未完成

使用的服务器和技术

  • Glassfish 4.0(Build 89)
  • 日食
  • 泽西
  • EJB

EJB示例类

@Stateless
@RequestScoped
@Path("/companys")
public class CompanysResource {
    @SuppressWarnings("unused")
    private static final Logger mLogger = LoggerFactory
            .getLogger(CompanysResource.class);

    @HeaderParam(UserSession.SESSION_NAME)
    private String mSessionId;

    @Context
    private ResourceContext mResourceContext;

    @Context
    private UriInfo mUriInfo;

    @PersistenceContext(unitName = PersistenceUtils.PERSISTENCE_UNIT)
    private EntityManager mEntityManager;
    private CompanyService mCompanyService;

    public CompanysResource() {
      ...
    }

    @PostConstruct
    public void initServices() {
        mCompanyService = new CompanyService(mEntityManager);
    }

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public Response create(CompanyDTO companyDTO) {
        UserSession userSession = UserSessionService
                .getValidUserSessionBySessionId(mEntityManager, mSessionId);
        //***************************************************
        //Long running example!
        //Server shutting down before leaving the persist function
        //***************************************************
        Company company = mCompanyService.persist(userSession, companyDTO);

        // Create URI
        UriBuilder absolutePathBuilder = mUriInfo.getAbsolutePathBuilder();
        URI createdURI = absolutePathBuilder.path(company.getId().toString())
                .build();

        return Response.created(createdURI).build();
    }
    //...
}

坚持。xml

<?xml version="1.0" encoding="UTF-8"?>
<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="ILVPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <!-- Tomcat Datasource -->
    <!--  <non-jta-data-source>java:/comp/env/jdbc/prego_ilvDS</non-jta-data-source> -->
    <!-- <jta-data-source>java:/comp/env/jdbc/prego_ilvDS</jta-data-source> -->

    <!-- Glassfish Datasource -->
    <!-- <non-jta-data-source>jdbc/prego_ilvDS</non-jta-data-source> -->
    <jta-data-source>jdbc/prego_ilvDS</jta-data-source>

    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <!-- Shared Cache Enable/Disable -->
      <property name="eclipselink.cache.shared.default" value="false"/>

      <!--  Statement caching -->
      <property name="eclipselink.jdbc.cache-statements" value="true" />
      <!-- Batch writing -->
      <!--
      <property name="eclipselink.jdbc.batch-writing" value="JDBC" />
      <property name="eclipselink.jdbc.batch-writing.size" value="1000" />
      -->

      <!--  Close EntityManager on commit, to avoid cost of resume -->
      <!-- <property name="eclipselink.persistence-context.close-on-commit" value="true" /> -->

      <!--  Avoid auto flush cost on query execution -->
      <!--
      <property name="eclipselink.persistence-context.flush-mode" value="commit" />

      <property name="eclipselink.persistence-context.reference-mode" value="WEAK"/>
      -->

      <!--  Avoid cost of persist on commit -->
      <!-- <property name="eclipselink.persistence-context.persist-on-commit" value="false" /> -->

      <!-- EclipseLink JPA Debug Logging -->
      <!-- Turn Logging Off -->
      <!-- <property name="eclipselink.logging.level" value="off" /> -->
      <property name="javax.persistence.logging.level" value="INFO"/>
      <!-- -->
      <property name="eclipselink.logging.level.sql" value="FINE"/>
      <property name="eclipselink.logging.parameters" value="true"/>
      <!-- -->
    </properties>
  </persistence-unit>
</persistence>

感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    确保使用@Transactional annotation对服务方法进行了注释。没有它,内部的数据库操作不会在一个事务中执行,而是使用autocommit。 还可以在类上使用@Transactional注释。这与在每种方法上使用相同。 希望有帮助