2010-02-10 147 views
0

每隔几次我在开发服务器上运行我的应用程序,它似乎都陷入了僵局。我不确定它是否也会在生产服务器上出现死锁。我暂停了这些线程,发现其中一个卡住在​​块的开始部分Permissions.implies:162处。Google App Engine - 死锁?

我的代码的作用是:在主页上,它同时向我的InitServlet servlet发送5个jquery请求,该servlet的方法​​的方法为service。每次通过服务方法时,都会初始化一个不同的组件,每个组件都需要大约2秒钟才能初始化。线程到达服务方法的顺序并不重要,在服务器启动时只发生5次,所以我认为应该可以同步服务方法。

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

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

回答

1

你不应该用请求来初始化您的应用程序是这样的:App Engine应用程序的实例可以启动或在任何时候关闭,应用程序引擎将产生多个并发实例以处理任何请求速率,因此不同的虚拟机可能会获得不同的“初始化”调用子集。

+0

是它的一种黑客,我没有让我的应用引擎冷启动时间缩短到3秒而不是10秒。对于getPersistenceManagerFactory,JDO需要相当多的时间进行初始化,大约需要2秒,对于我来说,我需要大约3秒的时间,因为它构建了一些关于模型类的元数据或其他东西。另外我使用openid4java,它也有很长的启动时间。所以我所做的是直到初始化完成,如果可以的话,我只是直接从memcache中提取页面。 – Kyle 2010-02-12 19:28:39

+0

如果只有App Engine支持此功能请求,请访问http://code.google.com/p/googleappengine/issues/detail?id=2690。那么我不必担心冷启动时间,也不必花费大量时间优化我的冷启动时间。因为就像现在这样,即使有很好的流量,总会有一些用户加载请求(例如,当第二个或第三个JVM实例启动时)。 – Kyle 2010-02-12 19:32:31