Oracle ADF Web浏览器刷新按钮变为旧页面

时间:2012-11-29 13:02:26

标签: oracle-adf jdeveloper

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

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

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

解决方案

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

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

1 个答案:

答案 0 :(得分:2)

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

我正在使用JDeveloper 11.1.1.7。将迭代器上的“CacheResults”属性设置为false解决了这个问题(转到页面的“绑定”标签或包含该表的页面片段,选择Iterator Executable for your表数据,在“高级”部分的Property Inspector中,将“CacheResults”设置为“false”)。

就XML而言,PageDef.xml文件中的迭代器定义应该类似于

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

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


ADDENDUM 03-DEC-2012

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

在ADF中解决这个问题的一个解决方案是为View对象创建一个实现类,覆盖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