我正在开发一个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();
}
答案 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 READ
。 SELECT
隐式打开一个事务,后续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。