GlassFish 3.1 (ビルド 43) サーバーで実行されている古い Web ベースのアプリケーション (Spring 2.5.4 フレームワークを使用した Java) があります。このアプリケーションは最近 (数週間前)、Oracle 11g (11.2.0.3.0) データベースと ojdbc6.jar/orai18n.jar (Oracle 10g 10.2.0.3.0 および ojdbc14.jar から) を使用するようにリダイレクトされました。 - JDBC シン接続を使用します。アプリケーションは接続に org.apache.commons.dbcp.BasicDataSource バージョン 1.2.2 を使用しており、データベース リクエストは Spring jdbcTemplate (JdbcDaoSupport 抽象クラスを介して) または Spring の PlatformTransactionManager を介して処理されます。
今朝、アプリケーション ユーザーが情報を入力して変更し、後でアプリケーションを介してそのデータを取得して印刷できることを確認しましたが、過去 24 時間にコミットされた更新はありませんでした。このアプリケーションには現在、毎日数人のユーザーしかいません。彼らは明らかに、前日に接続プールによって開かれた同じ接続を共有しているため、コミットされていない更新はアプリケーションを通じて表示されましたが、データベースへの他の接続を通じては表示されませんでした。 . 接続が閉じられると、コミットされていない更新が失われました。
サーバー ログを調べたところ、データベースに変更が最後にコミットされた時刻から、翌朝印刷されたレポートの時刻まで、エラーは示されませんでした。さらに、JDBC 接続が Auto-Commit false に設定された状態で (何らかの方法で) 変更が行われた場合でも、トランザクションの一部である更新の一部に対して特定のコミットが行われました。 /catch ブロックは、「transactionManager.commit(transactionStatus);」のいずれかを実行する必要があります。または「transactionManager.rollback(transactionStatus);」エラーなしで処理されたはずの呼び出し。コミットが正常に返されたように見えますが、実際にはコミットは行われませんでした。
GlassFish ドメインとアプリケーションを再起動すると、さまざまな更新が入力されたときにコミットされ、通常の操作が復元されました。
私の質問は、このようなことが起こっているのを見たり聞いたりした人はいますか?もしそうなら、何が原因でしたか?
ここでのアイデアに感謝します-私たちは途方に暮れています。
いくつかの新しい情報:
Oracle 11g サーバーを調査したところ、コミットが停止したように見える頃に、完全に解決できなかった他の操作で 4 つの操作がブロックされていたことがわかりましたが、おそらく更新でした。
Glassfish サーバーのログを調べたところ、この推定開始時刻に続いてワーカー スレッドの外観が変化し、1 つのスレッドのみが数時間使用され続けるまで、ログに表示されるスレッドが少なくなったことが示されました。
問題は約 1 週間後に再び発生し、約 1/2 時間後に発見されました。この時点で、2 つのワーカー スレッドが動作していました。