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

标签 hibernate exception tomcat grails

我在生产环境(底部的堆栈跟踪)中遇到严重的 IllegalStateException 错误。在本地,在 dev 上一切正常,我从未在本地遇到过那段代码的任何问题。

Prod 和 Dev 配置具有相同的 Tomcat 5。在开发上我有 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 限制)并没有帮助。在本地运行应用程序并将开发数据库更改为生产 Postgres 8.4 工作正常(过程完成且没有错误)所以这一定是生产服务器上的应用程序有问题。

有人知道这可能是关于什么的吗?

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)

最佳答案

鉴于

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 进程由于某种原因正试图关闭,当您尝试在正在关闭的应用程序中执行 Controller 操作时发生异常。

你说的

I thought it may be an issue with memory and the VPS server killing the most memory consuming process, but changing the JAVA_OPTS Xmx to 256m which is way below the 500m limit the server has, did not help

Java 内存不仅仅是堆大小(-Xmx),还有 PermGen 大小(-XX:MaxPermSize=...)和其他设置用于堆栈空间等。您可能还需要限制这些空间,以便将整个过程保持在 VPS 内存限制以下。

关于hibernate - Grails - 严重的 IllegalStateException - 类 [] 上的方法在 Grails 应用程序之外使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770649/

相关文章:

Java GWT 编译错误 NoSuchMethodError

java - tomcat不支持major.minor版本52.0

css - Bootstrap - 列出现在彼此之上

java - 具有继承性的 JPA 映射 View 和表

hibernate - 缓存条目未使用

java - 为什么运行时异常在Java代码中被称为运行时异常?

c++ - 毫无异常(exception)地编写 C++ 吗?

java - 我应该在哪里保存我的 jar 文件以便所有项目都常用它们?

java - @Transactional 不会在数据库中生成 INSERT

java - 为什么在使用带有 quarkus panache 的延迟获取时向下转换会引发异常?