0

我正在使用 Windows 7、Eclipse Juno、Eclipselink JPA 作为 ORM 和 Glassfish 作为 Oracle 11g 的应用程序服务器来开发 Spring MVC Web 应用程序。当我使用 Eclipselink 时,我注意到当我通过执行更新 PL/SQL 查询手动更新表时,它对 Eclipselink 已经检索到的实体没有任何影响,直到重新启动服务器。虽然,我通过<shared-cache-mode>NONE</shared-cache-mode>在persistance.xml 中并使用EntityManager.clear(),EntityManager.close()和禁用了 Eclipselink 缓存@Cacheable(false)

然后,我注意到当我使用 Oracle-SQLDeveloper 表设计器更新表时,它完全可以正常工作并且实体正在显示更新的信息。因此,我检查了 SQLDeveloper 日志以查看它用于更新行的查询,并且我看到它在 where 子句中使用了 ORA_ROWSCN 和 ROW ROWID。之后,我使用了与用于更新表的 SQLDeveloper 完全相同的 where 子句,但实体仍然显示旧信息。

我想知道 Eclipslink 没有从数据库中获取实时数据涉及哪些因素?但是,在使用 SQLDeveloper 设计器更新表后,Eclipselink 正在显示实时数据。使用 SQLDeveloper 表设计器修改表数据似乎也通过使用某些数据库功能将表标记为已更改。然后,Eclipselink 将在击中表之前读取标记。

另外为了获得更多说明,任何人都知道 Eclipselink 在用户命令执行 TypedQuery 时决定访问数据库之前涉及哪些步骤?我很好奇它在哪里存储缓存的实体?因为缓存休息只需重新启动计算机;我尝试重新启动 Glassfish,杀死 java 进程并注销当前用户,但它们都不起作用。为什么 Eclipselink 仍然在缓存实体,因为我将其配置为不使用任何缓存过程?是否可以在 Eclipselink 中完全关闭缓存?

4

0 回答 0