关于j2ee中死锁问题的研究

关于j2ee中死锁问题的研究

ID:29489878

大小:85.28 KB

页数:11页

时间:2018-12-20

关于j2ee中死锁问题的研究_第1页
关于j2ee中死锁问题的研究_第2页
关于j2ee中死锁问题的研究_第3页
关于j2ee中死锁问题的研究_第4页
关于j2ee中死锁问题的研究_第5页
资源描述:

《关于j2ee中死锁问题的研究》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、关于J2EE中死锁问题的研究大多数重要的应用程式都涉及高度并发性和多个抽象层。并发性和资源争用有关,并且是导致死锁问题增多的因素之一。多个抽象层使隔离并修复死锁环境的工作变得更加困难。通常,当同时执行两个或两个以上的线程时,如果每个线程都占有一个资源并请求另一个资源,这时就会出现死锁情况。因为如果一个线程不能获取资源,则所有线程都不能继续执行,我们称那个特定的线程被阻塞;如果每个线程都由于同组中另一个线程所占有的资源而被阻塞,我们就称这个线程组被死锁。在本文中,我们将讨论发生在典型的重要J2EE应用程式中的两大类死锁情况:"简单"数据库死锁和跨资源死锁。虽然我们的讨论基于J

2、2EE平台,但也适用于其他技术平台。数据库死锁在数据库中,如果一个连接占用了另一个连接所需的数据库锁,则他能阻塞另一个连接。如果两个或两个以上的连接相互阻塞,则他们都不能继续执行,这种情况称为死锁。数据库死锁问题不易处理,这是因为涉及到的锁定通常不是显式的。通常,对数据行进行隐式更新时,需要锁定该数据行,执行更新,然后在提交或回滚封闭事务时释放锁。由于数据库平台、设置的隔离级及查询提示的不同,获取的锁可能是细粒度或粗粒度的,他会阻塞(或不阻塞)其他对同一数据行、表或数据库的查询。获取的锁依赖于内部生成的查询计划。当数据大小和分步随时间发生变化时,该计划也可能改动。这样在一个

3、环境中获取一组锁的查询能尝试在另一个环境中获取一组完全不同的锁。必要时,数据库能随意地增加他的锁。例如,数据库可能会选择锁定整页,而不是锁定同一数据页中的10个数据行,这会阻塞对无需锁定的数据行的读写权限。基于数据库模式,读写操作会需求遍历或更新多个索引、验证约束、执行触发器等。每个需求都会引入更多锁。此外,其他应用程式还可能正在访问同一数据库模式中的某些对象,并获取不同于你的应用程式所具有的锁。所有这些因素综合在一起,数据库死锁几乎不可能被消除了。值得庆幸的是,数据库死锁通常是可恢复的:当数据库发现死锁时,他会强制销毁一个连接(通常是使用最少的连接),并回滚其事务。这将释

4、放所有和已结束的事务相关联的锁,至少允许其他连接中有一个能获取他们正在被阻塞的锁。由于数据库具有这种典型的死锁处理行为,所以当出现数据库死锁问题时,数据库常常只能重试整个事务。当数据库连接被销毁时,会抛出可被应用程式捕捉的异常,并标识为数据库死锁情况。如果允许死锁异常传播到初始化该事务的代码层之外,则该代码层能只启动一个新事务并重做先前所有工作。要正确使用此策略,则在事务成功提交之前,他的代码不能有其他操作。注意:要限制重试次数,否则易导致死锁的代码块会永久循环下去。如果出现问题就重试,这种方法有点笨。不过,由于数据库能自由地获取锁,所以几乎不可能确保两个或两个以上的线程不

5、发生数据库死锁。此方法至少能确保在出现某些罕见的数据库死锁情况时,应用程式能正常运行。这比需求用户去重试操作要好得多。在J2EE应用程式中,研发人员能设置一个EJB调用以使用Bean托管事务(BMT)?研发人员启动、提交或回滚特定的事务或容器托管事务(CMT)?调用方法前启动事务,并在方法完成后提交或回滚事务。如果EJB供给商提供retry-on-deadlock参数,从而能通过容器托管事务自动完成此操作,那当然再好不过了。如果没有这种自动功能,研发人员最终将仅为了对死锁进行重试而强制EJB调用使用Bean托管事务。遇见死锁问题和锁定其他线程的锁的具体频率在非常大程度上取决

6、于数据库平台、硬件、数据库模式和查询。在使用基于锁的并发控制的数据库(如MSSQL)中,未提交的写操作会阻止读操作,而未提交的读操作会阻止写操作,使数据库更易出现死锁问题。在多版本并发控制(MVCC)数据库(如Oracle)中,未提交的写操作不阻止读操作?读操作仅查看旧版本数据行。这虽然会引入其他问题,但不会造成同样多的死锁机会。我们要让自己熟悉这些数据库锁定模式,并注意自己正在使用的类型。在查找、修复及避免数据库死锁方面,有一些非常好的参考方法,但他们都不能完全消除死锁的可能性。跨资源死锁当死锁情况不完全局限于数据库时,将更难找到他。数据库对占有和请求的锁有识别能力,所以

7、能检测整个数据库中的死锁;此外,数据库事务在确定哪些东西是原子、哪些不是方面提供了一个良好的界线,所以能轻松地回滚事务,使其从死锁中恢复。其他环境(如Java虚拟机)中的死锁或可跨环境的死锁更加危险,因为环境不能(或没有)检测到这些死锁并尝试恢复。更糟糕的是,这些死锁会产生综合效果?如果两个线程占有某些资源集时出现死锁,则其他所有尝试访问其中一个资源的线程也将被阻塞,该线程已获取的所有资源也被阻塞。这些死锁常常不易发现,但对常见模式有一定的了解将有助于识别和修复死锁问题。当环境中出现可疑的死锁情况时,你就需要考虑一

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。