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