如何在并发 ajax 请求的会话中使用 Apache Cayenne 上下文?
How to use Apache Cayenne context in session with concurrent ajax requests?
我在会话中存储了一个 ObjectContext。现在我对同一会话有多个 ajax 请求,所有请求都修改了 ObjectContext 的数据。我该如何确保这些请求是线程安全的?
以下文档建议我使用上下文嵌套。有人可以给我一个具体的例子来说明这是如何工作的吗?甚至解释嵌套上下文将如何允许线程安全请求。甚至 link 一些关于这些情况下最佳实践的文档。谢谢!
https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html
嵌套对于创建需要全部提交到中间内存存储(父上下文)或回滚而不影响已记录在父上下文中的更改的独立对象编辑区域(子上下文)很有用。考虑级联 GUI 对话框,或并行 AJAX 请求进入同一会话。
编辑:我在文档中找到了以下对我有帮助的段落。
仅用于从数据库中获取对象并且其对象永远不会被应用程序修改的上下文可以在多个用户(和多个线程)之间共享。存储已修改对象的上下文只能由单个用户访问(例如,Web 应用程序用户可能会在同一 HttpSession 中的多个 Web 请求之间重用上下文实例,从而在请求之间携带未提交的对象更改,直到他决定提交或回滚它们)。即使对于单个用户,使用多个 ObjectContext 也可能有意义(例如,请求范围的上下文以允许来自浏览器的并发请求独立更改和提交对象)
如果您不在请求之间在服务器上保留未提交的更改,甚至还有更简单的解决方案。不要使用会话范围的 ObjectContext。而是使用每个请求甚至每个方法的上下文。当给定请求引入的所有更改都隔离在单个方法调用中时,Per-method 在典型情况下起作用。然后,您将在方法条目上创建一个上下文,加载对象(使用查询或通过 'localObject' 从另一个上下文传输),执行更改,提交。之后上下文被丢弃。例如:
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();
}
我在会话中存储了一个 ObjectContext。现在我对同一会话有多个 ajax 请求,所有请求都修改了 ObjectContext 的数据。我该如何确保这些请求是线程安全的?
以下文档建议我使用上下文嵌套。有人可以给我一个具体的例子来说明这是如何工作的吗?甚至解释嵌套上下文将如何允许线程安全请求。甚至 link 一些关于这些情况下最佳实践的文档。谢谢!
https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html
嵌套对于创建需要全部提交到中间内存存储(父上下文)或回滚而不影响已记录在父上下文中的更改的独立对象编辑区域(子上下文)很有用。考虑级联 GUI 对话框,或并行 AJAX 请求进入同一会话。
编辑:我在文档中找到了以下对我有帮助的段落。
仅用于从数据库中获取对象并且其对象永远不会被应用程序修改的上下文可以在多个用户(和多个线程)之间共享。存储已修改对象的上下文只能由单个用户访问(例如,Web 应用程序用户可能会在同一 HttpSession 中的多个 Web 请求之间重用上下文实例,从而在请求之间携带未提交的对象更改,直到他决定提交或回滚它们)。即使对于单个用户,使用多个 ObjectContext 也可能有意义(例如,请求范围的上下文以允许来自浏览器的并发请求独立更改和提交对象)
如果您不在请求之间在服务器上保留未提交的更改,甚至还有更简单的解决方案。不要使用会话范围的 ObjectContext。而是使用每个请求甚至每个方法的上下文。当给定请求引入的所有更改都隔离在单个方法调用中时,Per-method 在典型情况下起作用。然后,您将在方法条目上创建一个上下文,加载对象(使用查询或通过 'localObject' 从另一个上下文传输),执行更改,提交。之后上下文被丢弃。例如:
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();
}