実稼働環境で実行している Web アプリケーションがあり、ある時点でクライアントがアプリケーションの速度が遅いと不満を漏らしました。
アプリケーションとデータベースで何が起こっているかを確認したところ、この「貴重な」クエリが複数のユーザーによって同時に実行されていたことがわかりました (したがって、データベース サーバーに非常に高い負荷がかかっています)。
SELECT NULL AS table_cat,
o.owner AS table_schem,
o.object_name AS table_name,
o.object_type AS table_type,
NULL AS remarks
FROM all_objects o
WHERE o.owner LIKE :1 ESCAPE :"SYS_B_0" AND
o.object_name LIKE :2 ESCAPE :"SYS_B_1" AND
o.object_type IN(:"SYS_B_2", :"SYS_B_3")
ORDER BY table_type, table_schem, table_name
私たちのアプリケーションはこのクエリを実行しません。Hibernate の内部クエリだと思います。Hibernate がこの非常に重いクエリを実行する理由についての情報はほとんど見つかりませんでした。
本番環境情報: Red Hat Enterprise Linux 5.3 (Tikanga)、JDK 1.5、Web コンテナ OC4J (whitin Oracle Application Server)、Oracle Database 10.1.0.4、JDBC Driver for JDK 1.2 および 1.3、Hibernate バージョン 3.2.6.ga、接続プール ライブラリ C3P0 バージョン 0.9.1。
UPDATE :実際にクエリを実行するのは Hibernate であることを claryfing してくれた @BalusC に感謝します。今、何が起こっているのかについてより良い考えを持っています。ハイバネート セッションを処理する方法を説明します (これは非常に初歩的なものです。より適切に処理する方法について提案があれば、大歓迎です!)
フィルタ (javax.servlet.Filter を実装) があり、開始時 (init メソッド) にセッション ファクトリを構築します (おそらく、これは 1 回だけ発生します)。次に、アプリケーションに送信されるすべての HttpRequest がフィルターを通過して新しいセッションを取得し、トランザクションを開始します。プロセスが終了すると、フィルターを介して戻ってきて、トランザクションをコミットし、休止状態のセッションを強制終了してから、転送ページに進みます (休止状態のセッションは HTTP セッションではうまく機能しなかったため、HTTP セッションには保存しません)。私たちのテスト)。
ここで、私が問題だと思う部分が来ます。私たちの開発環境では、Tomcat 5.5 にアプリを展開し、サービスを開始すると、すべてのフィルターがすぐに1 回だけ開始されます。OC4Jを使用した本番環境では、そのようには機能しないようです。アプリケーションをデプロイし、最初のリクエストが到着したときにのみ、OC4J がフィルタをインスタンス化します。
これは、OC4Jがすべてのリクエストで(または少なくとも複数回、それでも間違っている)フィルタをインスタンス化し、したがってすべてのリクエストでセッションファクトリを作成し、その %&%#%$# クエリを実行すると考えるように導きます。私の問題!
さて、それは正しいですか?フィルタを一度だけインスタンス化するようにOC4Jを構成する方法はありますか?
お時間を割いてご回答いただき、誠にありがとうございました。