关于J2EE中死锁问题的研究(3)

经验法则

  下面的这些指导可以帮您避免死锁问题,或者至少在出现死锁时能诊断并修复它们。
  • 保持事务简短。
  • 了解数据库锁行为(以及事务分离层)。
  • 假定任何数据库访问都有可能陷入数据库死锁状况,但是能正确重试。
  • 事务完成前不要更新任何非事务状态(内存状态、缓存等)。
  • 确保在峰值并发时有足够大的资源池。
  • 尝试不在同一时刻获取多个资源。如果必需,则按相同的顺序每次获取一个资源。
  • 了解如何从应用服务器获取完整的线程转储以及从数据库获取数据库连接列表(包括互相阻塞的连接),知道每个数据库连接与哪个Java线程相关联。了解Java线程和数据库连接之间映射的最简单方法是向连接池访问模式添加日志记录功能。
  • 当进行嵌套的EJB调用时,了解哪些调用使用与调用方同样的数据库连接。即使嵌套的调用运行在同一个全局事务中,它仍将使用不同的数据库连接,而这会导致跨资源死锁。
  • 避免执行数据库调用和EJB调用,或在占有Java虚拟机锁时,执行其他与Java虚拟机无关的操作。如果有需要留心的特定Java虚拟机锁,就使用assert(!Thread.holdsLock(...)),从而避免以后的代码更改不会在无意间违背此规则。
  结束语

  J2EE应用程序中的跨资源死锁是一个大问题——它能导致整个应用程序慢慢终止,还很难被分离和修复,尤其是当开发人员不熟悉如何分析死锁环境的时候。我们讨论的情形将有助于您理解一些常见的死锁情形,并为您提供查找死锁的思路。更重要的是,我们概括的经验法则提供了一些要在代码中遵守的惯例,从而避免所有类似的死锁问题。
posted @ 2008-04-28 10:38  谢芳[Kevin]  阅读(217)  评论(0编辑  收藏  举报