製品環境で重大な IllegalStateException エラーが発生しています (下部のスタックトレース)。ローカルでは、開発ではすべてが正常に機能し、そのコードでローカルで問題が発生したことはありません。
Prod と Dev の構成には同じ Tomcat 5 があります。dev には PostgreSQL 9.2 があり、prod 8.4 にはあります。Pord 環境は、一部のホスティングの VPS です。
これを引き起こすコードは、単純なクラス インスタンス クリエーター (GameStateTransition クラス) です。これは、370,000 を超えるインスタンスの初期化と保存を担当します。エラーの原因となる行は、save(flush:true) または hibernateSesion.flush() のいずれかです。両方のオプションを試しました。
エラーは非決定論的に発生します-160 000インスタンスを作成した後、220 000後、300 000...
メモリの問題である可能性があり、VPS サーバーが最もメモリを消費するプロセスを強制終了している可能性があると考えましたが、JAVA_OPTS Xmx を 256m に変更しました。これは、サーバーの制限である 500m をはるかに下回っています。アプリをローカルで実行し、dev DB を実稼働の Postgres 8.4 に変更すると正常に機能したため (プロセスはエラーなしで終了しました)、prod サーバー上のアプリに問題があるはずです。
誰もが手がかりを持っています、それは何についてでしょうか?
スタックトレースが言っているのは、mongoDB、注釈のテストとモックに関するものですが、私はそれを使用していません。インスタンスを作成してDBに保存するシンプルなコードです。
2013-02-08 00:07:50 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-12200"]
2013-02-08 00:07:50 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
2013-02-08 00:07:50 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
2013-02-08 00:07:50 org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
2013-02-08 00:07:51 org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
2013-02-08 00:07:52 org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
2013-02-08 00:07:52 org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
2013-02-08 00:07:52,979 [http-bio-12200-exec-6] ERROR errors.GrailsExceptionResolver - IllegalStateException occurred when processing request: [GET] /gameState/initializeTransitionMatrix
Method on class [pl.edu.caspar.analyzer.GameStateTransition] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.. Stacktrace follows:
java.lang.IllegalStateException: Method on class [pl.edu.caspar.analyzer.GameStateTransition] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
at org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener.onApplicationEvent(AbstractPersistenceEventListener.java:46)
at pl.edu.caspar.analyzer.GameStateController$_initializeTransitionMatrix_closure3_closure8.doCall(GameStateController.groovy:59)
at pl.edu.caspar.analyzer.GameStateController$_initializeTransitionMatrix_closure3.doCall(GameStateController.groovy:53)
at pl.edu.caspar.analyzer.GameStateController.initializeTransitionMatrix(GameStateController.groovy:52)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)