0

我遇到了一个问题,即写入数据库的时间比平时要长。这些延迟写入会导致写入后执行的逻辑块正确。我重新启动了服务器,一切正常。我担心的是,如果服务器开始滞后,我将再次遇到这个延迟写入问题。

我正在使用带有 EntityManager 的 Java Transaction API (JTA)。

@Inject
private EntityManager em;

当我想要它时,如何强制 EntityManager 进行显式提交?

在执行下一行代码之前,我如何才能等到写入完成?

EntityManager 是否自动提交?,如果是这样,它什么时候做?


我试过 em.getTransaction().commit(); 这会产生错误: JTA can not use getTransaction

我做了一些研究,发现我不应该使用 em.getTransaction().begin(); 也不是 em.getTransaction().commit();,这些指令将与 RESOURCE_LOCAL 事务类型一起使用。在我的情况下,事务由容器管理。

代码片段:

public void addNewUserRoleWithMonthExpiry(User user,String role,Date startDate,Date newDate){
        Set<Userrole> roles = user.getUserroles();      
        Role r = roleRepostitory.findByName(role);
        Userrole ur = new Userrole(user, r, startDate, newDate);
        roles.add(ur);
        em.persist(ur); //<==== I want to make sure this committed now!!!
}

如果 em.persist(ur); 不会立即将 Userrole 提交到数据库,然后执行的代码从数据库读取并检查该 Userroel 是否存在将不正确,因为该角色尚未写入。


持久性.xml

<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="persistence-memberDB">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- <jta-data-source>java:/DefaultDS</jta-data-source>   -->
        <jta-data-source>java:/mydb</jta-data-source>  <!-- See <datasource jndi-name="..."> . -->
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

        <properties>
           <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
           <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
           <property name="hibernate.show_sql" value="false"/>
           <property name="hibernate.cache.use_second_level_cache" value="false"/>
           <property name="hibernate.cache.use_query_cache" value="false" />
           <property name="hibernate.cache.use_minimal_puts" value="true"/>           
           <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/>  
              <property name="hibernate.c3p0.acquire_increment" value="1"/>
          <property name="hibernate.c3p0.min_size" value="5"/>
          <property name="hibernate.c3p0.max_size" value="20"/>
          <property name="hibernate.c3p0.timeout" value="60"/>
          <property name="hibernate.3p0.max_statements" value="50"/>
          <property name="hibernate.c3p0.idle_test_period" value="3000"/>


          <property name="transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory"/>
          <property name="current_session_context_class" value="thread"/>
          <property name="hibernate.search.autoregister_listeners" value="false"/>              
      </properties>
    </persistence-unit>
</persistence> 
4

0 回答 0