我正在使用Windows 7,Eclipse Juno,Eclipselink JPA作为ORM和Glassfish作为Oracle 11g的应用程序服务器开发Spring MVC Web应用程序。当我使用Eclipselink时,我注意到当我通过执行更新PL / SQL查询手动更新表时,它对已经由Eclipselink检索的实体没有任何影响,直到重新启动服务器。尽管如此,我通过在persistance.xml中使用<shared-cache-mode>NONE</shared-cache-mode>
并使用EntityManager.clear()
,EntityManager.close()
和@Cacheable(false)
来禁用了Eclipselink缓存。
然后,我注意到当我使用Oracle-SQLDeveloper表设计器更新表时,它完全正常,实体正在显示更新的信息。所以我检查了SQLDeveloper日志以查看它用于更新行的查询,我看到它在where子句中使用ORA_ROWSCN和ROW ROWID。之后,我使用了与用于更新表的SQLDeveloper相同的where子句,但仍然有实体显示旧信息。
我想知道Eclipslink没有从数据库中获取实时数据的因素是什么?但是,在用SQLDeveloper设计器更新表后,Eclipselink正在显示实时数据。似乎使用SQLDeveloper表设计器修改表数据也会通过使用某些数据库功能将表标记为已更改。然后,Eclipselink会在点击表格之前读取标记。
另外,为了获得更多说明,任何人都知道Eclipselink在用户命令执行TypedQuery之前决定命中数据库之前涉及哪些步骤?我很好奇它存储缓存实体的位置?因为缓存仅通过重新启动计算机来休息;我尝试重启Glassfish,杀死java进程并注销当前用户,但没有一个工作。为什么Eclipselink仍然是缓存实体,因为我将其配置为不使用任何缓存过程?是否可以在Eclipselink中完全关闭缓存?