如何在会话中使用Apache Cayenne上下文与并发的ajax请求?

时间:2015-04-10 01:08:21

标签: apache-cayenne

我在会话中存储了一个ObjectContext。现在我对同一个会话有多个ajax请求,都修改了ObjectContext的数据。我如何确保这些请求是线程安全的?

以下文档表明我使用了上下文嵌套。有人能给我一个具体的例子说明这是如何运作的吗?甚至可以解释嵌套上下文如何允许线程安全请求。甚至可以链接到这些案例中的一些最佳实践文档。谢谢!

https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html

嵌套对于创建需要全部提交到中间内存存储(父上下文)的孤立对象编辑区域(子上下文)或回滚而不影响已记录在父级中的更改非常有用。想想级联GUI对话框,或者来到同一会话的并行AJAX请求。

编辑:我在帮助我的文档中找到了以下段落。

仅用于从数据库中获取对象且其对象永远不会被应用程序修改的上下文可以在多个用户(和多个线程)之间共享。存储修改对象的上下文应仅由单个用户访问(例如,Web应用程序用户可能在同一HttpSession中的多个Web请求之间重用上下文实例,从而对请求中的对象进行未提交的更改,直到他决定提交或回滚他们)。即使对于单个用户,使用mutliple ObjectContexts也是有意义的(例如,请求范围的上下文允许来自浏览器的并发请求,这些请求可以独立地更改和提交对象)

1 个答案:

答案 0 :(得分:2)

如果您不在请求之间保留服务器上未提交的更改,则甚至可以提供更简单的解决方案。不要使用会话范围的ObjectContext。而是使用每个请求甚至每个方法上下文。当一个方法调用中隔离了给定请求引入的所有更改时,Per方法适用于典型情况。然后,您可以在方法输入,加载对象(通过查询或通过' localObject'从另一个上下文传输)创建上下文,执行更改,提交。之后,上下文被丢弃。 E.g:

public void myActionMethod() {
     ObjectContext peer = serverRuntime.newContext();
     ... do work with objects in 'peer'
     peer.commitChanges();
}

现在,如果您执行保留未提交的更改,您仍然可以使用每方法上下文,但嵌套。所以上面的例子变成了这个:

public void myActionMethod() {
     ObjectContext nested = serverRuntime.newContext(sessionContext);
     ... do work with objects in 'nested'
     nested.commitChangesToParent();
}