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