Google App Engine (Java) + Spring 管理的 PersistenceManager

Posted

技术标签:

【中文标题】Google App Engine (Java) + Spring 管理的 PersistenceManager【英文标题】:Google App Engine (Java) + Spring managed PersistenceManager 【发布时间】:2010-12-31 20:32:20 【问题描述】:

我对刚刚检索到的对象列表的 JDO 持久性有点问题。

我想做的是:

获取“订单”列表 修改一个属性“状态” 批量更新“订单”

到目前为止,我得到的是“具有 id ... 的对象由不同的对象管理器管理”。 但是等等,没有 Spring,我还没有遇到过这样的问题!

我尝试这样调试它:

List<Orderr> orders = orderDao.findByIdAll(ordersKeys);
for(Orderr o : orders) 
    System.out.println(JDOHelper.getPersistenceManager(o).hashCode());
    //hashcode is 1524670
    o.setSomething(somevalue);

orderDao.makePresistentAll(orders); //hashcode inside is 31778523

makePersistentAll 除了:

try 
    System.out.println(getPersistenceManager().hashCode());
    getPersistenceManager().makePersistentAll(entities);
 finally 
    getPersistenceManager().close();

我所有的 DAO 都扩展了 JdoDaoSupport。 pmf由spring注入和管理。

最后,问题来了:为什么在findByIdAll之后持久化管理器关闭了?或者我为什么要获得新的持久性管理器实例?当然,我的 findByIdAll 方法不会在持久性管理器上调用 close。

当然,如果我为每个“订单”调用 makePersistent,它的效果会很好。但它打破了业务和数据库逻辑的分层......

UPD 刚刚发现迁移到 spring 管理的 PersistenceManager 后,所有对 makePersistentAll 的调用都不起作用。在春天之前,我使用了普通的旧 PMF.get() 助手,一切都很闪亮!

【问题讨论】:

【参考方案1】:

如果您的应用在响应 HTTP 请求时保持活动状态超过 30 秒,它将被终止。 GAE 的部分操作模式是您的应用程序不是长期存在的。完全没有。

虽然您不会在自己的网站上执行此操作,但您必须习惯于只能短期访问您的数据库会话管理器。有时需要很长时间才能为每笔交易重新打开它,但这就是 GAE 使流程可扩展的方式。如果您的流量确实很大,它可以在多台服务器上并行运行您的应用程序。

【讨论】:

虽然我正在开发 GAE 应用程序,但它并不特定于它。我在 localhost SDK 上也有同样的东西(除了 Jetty)。而且我认为,正如您所说,“数据库会话管理器”是 PersistenceManagerFactory 而不是 PersistenceManager。我可以从每个对象中获取旧的 PersistenceManager,但这不是我应该这样做的方式。这意味着它根本没有关闭,我猜是被spring从dao中移除的。 嗯。那么我认为我们已经超出了我的能力范围来帮助你。我在 GAE 应用程序中使用了一些 Spring,但我们的关系并不愉快。对不起,祝你好运!【参考方案2】:

这是一种魔法。每次我在这里提出问题时,我都会在发布后 24 小时内知道我的问题的答案。

当然,工厂按其含义应该总是创建一个新的 pm 实例。现在我保存了对旧 pm 的引用(就像我在 spring jdo daos 之前所做的那样)并且一切都很好。

【讨论】:

以上是关于Google App Engine (Java) + Spring 管理的 PersistenceManager的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine (Java) + Spring 管理的 PersistenceManager

在 Google App Engine/Java 中实现通配符搜索

Google-App-Engine 上的 Grails - 它死了吗? [关闭]

google app engine java - 基于域的重定向

在单个 Google App Engine 项目中同时使用 Java 和 Python

在 Google App Engine (Java) 中使用 Cron 执行后端