2011-06-21 13 views
2

のTomcatから不正な結果を得る:5.5
オラクル:11G(11.1.0.7.4)
JDK:1.6
休止状態:3.0.5休止オラクル

コンテキスト我々が使用している
ビューの行数を取得するための休止状態。 ビューは常に少なくとも1つの行を取得するように記述されています。 データベースには、ビューが8行を返すのに十分な行があります。我々は再びしようとした場合ZERO

として


たまに問題、我々はカウントを取得8の正しい数が返される(すなわち、ユーザは、最新の画面を表示し)。悪い結果
2を返す私たちは

1以下を除外するために、物事の束を試してみました

調査
)Oracleサーバーは)それがあることを確認するビューをチェック良いつまり、正しい戻りますです結果

今疑いが休止状態

コードスニペット方に回っています 以下のコードで何か不審な点を見つけることができますか?

public static int getRowCount(Criteria criteria) 
{ 
    int totalRows = 0; 
    criteria.setProjection(Projections.rowCount()); 
    Integer count = (Integer) criteria.uniqueResult(); 

    if (count != null) 
     totalRows = count.intValue(); 

    criteria.setProjection(null); 
    criteria.setResultTransformer(Criteria.ROOT_ENTITY); 

    return totalRows; 
} 

我々はまた、カウントはそれが聞こえるかもしれないとしてゼロではなくヌル
奇妙である、それは誤った結果を返し、私たちはOracleのホットフィックスを適用した場合に、さらにこのエラーが起こって始め公表Oracleの欠陥があることを確認しました。誰もが、それはOracleが間違った結果を返すことができることが可能です

質問
と思いますか?これを解決する方法上の任意の提案は、同様いただければ幸いです
...いくつかの重要な事実

概要 - 我々は11.1に11.1.0.6.1からOracle11Gをアップグレードしたほぼ同時期に起こって開始。 0.7.4といくつかのホットフィックスを行った。
- これは、その期間中に生態系に起こった唯一の変更です.Oracleへの変更
- これは一貫して起こりません。さてあなたは問題を見る - あなたはそうしない。
- 頻度が低い。しかし、アラームを引き起こすほど深刻です。

+1

hibernate.show_sqlは、ハイバーネーションが正しいSQLクエリを送信することを確認します – iliaden

答えて

1

私がやる最初のことは、Hibernateのクエリログを有効にすることです。これは、どのSQLがOracleに送信されているかを正確に示します。その正確なSQLを実行して、あなたが得るものを見ることができます。

次のいずれかの方法でクエリのログ記録をオンにすることができます

  • はorg.hibernateを調整します。SQLのログカテゴリ(more info)Hibernateのプロパティhibernate.show_sqlmore info
+0

プロパティ 'hibernate.show_sql'を' true'に設定するだけです。 – Marcelo

+0

あなたは正しいです。私はlog4jdbc.googlecode.comを使用しています。その間、私はデバッグするために他に何かがあるかどうか疑問に思っていました(私たちのQA envでヒットするには数日かかることがあります)。ありがとう! –

+1

@RNデータベースへのdbaアクセス権を持っている場合は、現在のセッションをデータベースに監視しているアプリケーションが実行しているsqlsを知ることができます。 – Marcelo

0

を設定

  • 私は非常にOracleがカウント権利を得ることができないことを疑います。他に何かが起こっている可能性が高い可能性があります(これは私がマットビューで見たものです)。誰かが完全リフレッシュを行っている場合(mviewの場合はatomic_refresh => false)、truncate + insertのようになります。

    このリフレッシュ中にあなたが数を選択している場合、何を推測し、カウントされますここで起こって何ができるか上= 0

    ただの推測。 DBAとして、そのビューを監視し、カウントを選択している間にリフレッシュが発生していないことを確認します。

  • +0

    これはマットビューではなく、普通の古いバニラビューです。 –

    1

    v $ SQLは、SQLが実行された回数と処理された行の数を表示します。

    Oracleバグの可能性があります。一般に、非常に複雑な問合せがありますが、特定のデータ・セットでは一般的に一貫しています。

    NO_DATA_FOUND例外は、PL/SQLプロシージャおよびファンクションから発生させることができます。このプロシージャおよびファンクションは、クライアントにとっては空の結果セットとして表示されることがよくあります。ビュー、テーブル、および関連するコードの詳細がなければ、それはすべての推測です

    +0

    Resultsetも取得できますか? –

    -2

    私の2セント: あなたはパフォーマンスの高いOracle DBMSを持っています。なぜそれをHibernateに接して安いレンタルされたミュールやMySqlデータベースのように扱うのですか?

    Hibernateとそのすべての特徴を習得するのと同じくらい、Oracle PL/SQLとJDBCを学ぶだけで十分です。そして、パフォーマンスの違いはちょうど素晴らしいです...

    +0

    時には真実が痛い... –