在entityManager.refresh()上的性能

时间:2013-07-11 15:08:33

标签: java jboss seam entitymanager

我对单个实体的entityManager刷新有一个问题需要花费很长时间,超过一分钟。我有一个屏幕,用户可以在其上编辑简单记录,例如更改某人的名字。他们可以在完成后保存或取消。在取消操作上,我正在执行以下行,以便如果他们进行了更改但又不想保存,则会清除对象的缓存副本中的更改。

getEntityManager().refresh(getInstance());

这是在一个entityHome bean上。我最终做的是使用

getEntityManager().clear();

对我来说完成了同样的事情,但在不到一秒的时间内就完成了。

我使用EE5,JDBC连接到Oracle 11g数据库,使用JTA连接事务。

有没有人对为什么这么长时间有任何想法?

1 个答案:

答案 0 :(得分:0)

refresh()从数据库重新加载实体(它执行SELECT并重新加载实体)。这总是比只清除第一级缓存的clear()慢。但请注意,如果您clear()缓存并且其中包含其他实体,则必须merge()它们(这也意味着从数据库重新加载)。

一分钟似乎需要很长时间来重新加载一个简单的记录,所以我认为这里有其他因素在起作用,例如锁定。

无论如何,这是因为你的&#34;取消&#34;按钮提交表单。提交表单后,将值复制到实体实例中,并将其标记为脏。避免此行为的最简单方法就是在按下&#34;取消&#34;:使用<s:button/><s:link/>进行GET而不是POST进行&#34;取消& #34;按钮。除非您通过AJAX提交更改,否则此操作有效,在这种情况下,实体已更新并设置为脏。