【问题标题】:Google App Engine - Deadlocking?Google App Engine - 死锁?
【发布时间】:2010-02-10 19:30:35
【问题描述】:

每次我在开发服务器上运行我的应用程序时,它似乎都会死锁。我不确定它是否也会在生产服务器上死锁。我暂停线程,发现其中一个线程卡在 Permissions.implies:162 处,这是 synchronized 块的开始。

我的代码所做的是:在主页上,它同时向我的InitServlet servlet 发送5 个jquery 请求,该servlet 具有service 方法synchronized。每次通过 service 方法初始化一个不同的组件,每个组件大约需要 2 秒来初始化。线程到达服务方法的顺序无关紧要,这种情况只发生5次,在服务器启动期间,所以我认为同步服务方法应该没问题。

关于如何解决这个死锁的任何建议,或者有谁知道它是否只是开发服务器的一个错误?

编辑:弄清楚死锁发生在哪里,但仍然不知道为什么。在 Permissions.implies 的锁内,一个线程调用 Class.getDeclaredConstructors0,并且永远不会从它返回。另一个线程正在等待获取 Permissions.implies 的锁。挂在getDeclaredConstructors0 上的第一个线程正在为从 GAE 示例文档中获取的标准 PersistenceManagerFactory 类进行类初始化。

【问题讨论】:

    标签: java google-app-engine synchronization jakarta-ee


    【解决方案1】:
    【解决方案2】:

    您不应该像这样使用请求来初始化您的应用:App Engine 应用的实例可以随时启动或关闭,并且 App Engine 将生成多个并发实例来以任何速率处理请求,因此不同VM 可能会获得不同的“初始化”调用子集。

    【讨论】:

    • 是的,这是我为了让我的应用引擎冷启动时间从 10 秒缩短到 3 秒而做的一种黑客行为。 JDO 需要相当长的时间来初始化,getPersistenceManagerFactory 大约需要 2 秒,而对我来说,我在第一次查询时大约需要 3 秒,因为它构建了一些关于模型类或其他东西的元数据。另外,我正在使用 openid4java,它的启动时间也很长。所以我所做的就是在初始化完成之前,如果可以的话,我只是直接从内存缓存中提供页面。
    • 如果只有 App Engine 支持此功能请求 -code.google.com/p/googleappengine/issues/detail?id=2690。这样我就不必担心冷启动时间,也不必花费大量时间优化我的冷启动时间。因为现在看来,即使有良好的流量,也总会有一些用户的加载请求(例如,当第二个或第三个 JVM 实例启动时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2018-02-14
    • 2011-02-11
    • 2011-10-25
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多