我对单个实体的entityManager刷新有一个问题需要花费很长时间,超过一分钟。我有一个屏幕,用户可以在其上编辑简单记录,例如更改某人的名字。他们可以在完成后保存或取消。在取消操作上,我正在执行以下行,以便如果他们进行了更改但又不想保存,则会清除对象的缓存副本中的更改。
getEntityManager().refresh(getInstance());
这是在一个entityHome bean上。我最终做的是使用
getEntityManager().clear();
对我来说完成了同样的事情,但在不到一秒的时间内就完成了。
我使用EE5,JDBC连接到Oracle 11g数据库,使用JTA连接事务。
有没有人对为什么这么长时间有任何想法?
答案 0 :(得分:0)
refresh()
从数据库重新加载实体(它执行SELECT
并重新加载实体)。这总是比只清除第一级缓存的clear()
慢。但请注意,如果您clear()
缓存并且其中包含其他实体,则必须merge()
它们(这也意味着从数据库重新加载)。
一分钟似乎需要很长时间来重新加载一个简单的记录,所以我认为这里有其他因素在起作用,例如锁定。
无论如何,这是因为你的&#34;取消&#34;按钮提交表单。提交表单后,将值复制到实体实例中,并将其标记为脏。避免此行为的最简单方法就是在按下&#34;取消&#34;:使用<s:button/>
或<s:link/>
进行GET而不是POST进行&#34;取消& #34;按钮。除非您通过AJAX提交更改,否则此操作有效,在这种情况下,实体已更新并设置为脏。