1

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

getEntityManager().refresh(getInstance());

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

getEntityManager().clear();

这对我来说完成了同样的事情,但运行时间不到一秒钟。

我正在使用 EE5、JDBC 连接到 Oracle 11g DB,并使用 JTA 进行事务处理。

有没有人知道为什么这需要这么长时间?

4

1 回答 1

0

refresh()从数据库中重新加载实体(它执行SELECT并重新加载实体)。这总是比clear()只清除一级缓存要慢。但是请注意,如果您clear()缓存并在其中包含其他实体,您将不得不使用merge()它们(这也意味着从数据库重新加载)。

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

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

于 2013-07-19T09:41:55.967 回答