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

时间:2010-01-02 20:41:28

标签: java spring google-app-engine persistence jdo

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

我想做的是:

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

到目前为止我所拥有的是“具有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由春天注入和管理。

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

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

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

2 个答案:

答案 0 :(得分:1)

如果您的应用在超过30秒的时间内响应HTTP请求仍然有效,则会被终止。 GAE的部分运作模式是您的应用程序不是长寿的。完全没有。

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

答案 1 :(得分:0)

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

当然,工厂的含义应该始终创建一个新的pm实例。现在我保存对我的旧pm的引用(就像我在spring jdo daos之前做的那样)并且每个人都可以。

相关问题