在使用 MongoDB 保存或更新 Grails 中的多个对象时,我发现了一个奇怪的问题。目前我正在使用 Grails 2.2.3 和 MongoDB 插件 1.3.0。
问题似乎是,当我手动调用 GC 时,MiUsuario 的实例也不是 GC。在我们的主应用程序中,我们不进行批量更新,但是在进行负载测试(使用 JMeter 并使用 Java VisualVM 监视 JVM)时,此问题会导致内存填充和 Tomcat 停止响应。
我创建了一个小的新应用程序来显示问题。
一个简单的域对象:
class MiUsuario {
ObjectId id
String nickName
}
我的控制器:
import pruebasrendimiento.Prueba
class MiUsuarioController {
def doLogin(String privateKey, String id){
MiUsuario user = MiUsuario.get(id)
user.nickName = new Random().nextInt().toString()
user.save(failOnError:true)
render 'ok'
}
}
我的 BuildConfig(只是依赖项和插件部分):
dependencies {
}
plugins {
// runtime ":hibernate:$grailsVersion"
runtime ":jquery:1.8.3"
runtime ":resources:1.2"
build ":tomcat:$grailsVersion"
// runtime ":database-migration:1.3.2"
// compile ':cache:1.0.1'
runtime ":mongodb:1.3.0"
}
我也尝试过 Burt 很久以前说过的东西(http://burtbeckwith.com/blog/?p=73),但是 DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear() 没有任何区别。该页面中提到的另一个选项 RequestContextHolder.resetRequestAttributes() 给了我一个例外。