1

我正在开发一个 ADF 应用程序。我有个问题。我的 Jdev 版本 11.1.2.3.0。

所以,例如,我有一个像这样的 URL “http://www.hohoho.com/view/index.xhtml?_adf.ctrl-state=ju9lnu5ld_3”

在此页面中,我有一个表从 DB 获取值。例如,我在 DB 浏览器中更改了一些行,然后单击了 Web 浏览器的刷新按钮。但是没有得到新的结果!例如,我删除“?_adf.ctrl-state=ju9lnu5ld_3”并输入 url,这会得到新的结果。这种情况怎么可能处理。我需要当用户单击刷新按钮时,必须获取最后一个结果。我认为它基于 ADF 状态。这种情况怎么可能处理。

解决方案

感谢 Andread,mysql 的 autocommit 属性默认值为 true,而不是 false :) 但我使用的是 false。我已经解决了像你一样的问题,但是我自己的解决方案太酷了:) 我只覆盖了 clearCache() 方法。它解决了这个问题。

 public void clearCache() {
        getDBTransaction().commit(); // added
        super.clearCache();
    } 
4

1 回答 1

2

查询的结果缓存在中间层。这就是为什么在重新加载页面时不会反映通过与应用程序不同的渠道应用的数据库更新的原因。

我正在使用 JDeveloper 11.1.1.7。在迭代器上设置“CacheResults”属性以false解决此问题(转到包含表的页面或页面片段的“绑定”选项卡,为表数据选择迭代器可执行文件,然后在属性检查器中的“高级”部分,将“CacheResults”设置为“false”)。

就 XML 而言,PageDef.xml文件中的迭代器定义应如下所示

<iterator id="TestIterator" Binds="TestView1"
          DataControl="AppModuleDataControl" RangeSize="25"
          CacheResults="false"/>

似乎有一些额外的方法可以解决这个问题,这在早期的 JDeveloper 版本中可能是必需的:


附录 2012 年 12 月 3 日

OP 使用 MySQL。对于 MySQL,设置CacheResults属性是必需的,但还不够。默认情况下,MySQL 运行时autocommit=false具有使用隔离级别的副作用REPEATABLE READ。ASELECT隐式打开一个事务,随后SELECTs返回相同的结果。Oracle RDBMSREAD COMMITTED默认使用,因此在一个会话中插入和提交的数据由另一个会话中的 SELECT 返回。

在 ADF 中解决此问题的一种解决方案是为视图对象创建一个实现类,executeQueryForCollection()在执行查询之前覆盖并提交事务:

protected void executeQueryForCollection(Object object, Object[] object2, int i) {
    getApplicationModule().getTransaction().commit();
    super.executeQueryForCollection(object, object2, i);
}

请仔细使用它并查看您的实际隔离级别要求,以确保您不会通过浏览器刷新无意中提交数据。此解决方案的另一个缺点是它不能在 Oracle RDBMS 和 MySQL 之间移植。

有关 SSCCE,请参阅https://github.com/afester/StackOverflow/tree/master/AdfRefresh

于 2012-11-29T14:23:21.113 回答