Grails - 严重IllegalStateException - 类[]上的方法在Grails应用程序之外使用

时间:2013-02-08 10:37:31

标签: hibernate exception tomcat grails

我在prod环境中遇到严重的IllegalStateException错误(底部的stacktrace)。在本地,在dev上一切正常,我从未在本地遇到任何问题。

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个实例之后,有时甚至是30万个......

我认为这可能是内存和VPS服务器消耗最耗费内存的进程的问题,但是将JAVA_OPTS Xmx更改为256m,这远低于服务器的500m限制,但没有帮助。在本地运行应用程序并将dev DB更改为生产Postgres 8.4工作正常(该过程完成没有错误)所以它必须是prod服务器上的应用程序的问题。

任何人都有任何线索,可能是什么?

stacktrace所说的是关于mongoDB,测试和模拟注释的东西,但我没有使用它。这是一个简单的代码,可以创建实例并将其保存到数据库中。

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)

1 个答案:

答案 0 :(得分:0)

鉴于

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

这看起来像Tomcat进程因某种原因试图关闭,当您尝试在正在关闭的应用程序中执行控制器操作时会发生异常。

你说那个

  

我认为这可能是内存和VPS服务器消耗最耗费内存的进程的问题,但是将JAVA_OPTS Xmx更改为256m,这远低于服务器的500m限制,没有帮助

Java内存不仅仅是堆大小(-Xmx),还有PermGen大小(-XX:MaxPermSize=...)和堆栈空间的其他设置等。您可能还需要限制它们为了使整个过程低于VPS内存限制。