1

私はADFアプリケーションを開発しています。私は問題があります。私のJdevバージョン11.1.2.3.0。

したがって、たとえば、「http://www.hohoho.com/view/index.xhtml?_adf.ctrl-state=ju9lnu5ld_3」のようなURLがあります。

このページでは、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

クエリの結果は中間層にキャッシュされます。これが、アプリケーションとは異なるチャネルを介して適用されるデータベースへの更新が、ページのリロード時に反映されない理由です。

JDeveloper11.1.1.7を使用しています。この問題を解決するには、 Iteratorで「CacheResults」プロパティを設定しfalseます(テーブルを含むページまたはページフラグメントの「Bindings」タブに移動し、テーブルデータのIterator Executableを選択し、「Advanced」のプロパティインスペクターで「」セクションで、「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あります。暗黙的SELECTにトランザクションを開き、その後SELECTs同じ結果を返します。Oracle RDBMSはREAD COMMITTEDデフォルトで使用するため、あるセッションで挿入およびコミットされたデータは、別のセッションのSELECTによって返されます。

ADFでこれを回避する1つの解決策は、ビューオブジェクトの実装クラスを作成しexecuteQueryForCollection()、クエリを実行する前にトランザクションをオーバーライドしてコミットすることです。

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

これを注意深く使用し、実際の分離レベル要件を確認して、ブラウザーの更新によって意図せずにデータをコミットしないようにしてください。このソリューションのもう1つの欠点は、OracleRDBMSとMySQLの間で移植性がないことです。

SSCCEについては、https://github.com/afester/StackOverflow/tree/master/AdfRefreshを参照してください。

于 2012-11-29T14:23:21.113 に答える