如何通过慢速数据库写(JTA和EntityManager)确保正确的结果

时间:2014-04-01 15:28:10

标签: java database entitymanager jta hibernate-entitymanager

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

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

@Inject
private EntityManager em;

如何在我需要时强制EntityManager进行显式提交?

在执行下一行代码之前,我怎么能等到写完成?

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


我试过em.getTransaction()。commit();产生错误: JTA无法使用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(你);不会立即将Userrole提交到数据库,然后执行代码,然后从数据库读取并检查Userroel是否存在将是不正确的,因为该角色尚未写入。


的persistence.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> 

0 个答案:

没有答案