对J2EE中死锁问题的研究

大多数重要的应用程序都涉及高度并发性和多个抽象层。并发性与资源争用有关,并且是导致死锁问题增多的因素之一。多个抽象层使隔离并修复死锁环境的工作变得更加困难。

通常,当同时执行两个或两个以上的线程时,如果每个线程都占有一个资源并请求另一个资源,这时就会出现死锁情况。因为如果一个线程不能获取资源,则所有线程都不能继续执行,我们称那个特定的线程被阻塞;如果每个线程都由于同组中另一个线程所占有的资源而被阻塞,我们就称这个线程组被死锁。

在本文中,我们将讨论发生在典型的重要J2EE应用程序中的两大类死锁情况:“简单”数据库死锁和跨资源死锁。虽然我们的讨论基于J2EE平台,但也适用于其他技术平台。

数据库死锁

在数据库中,如果一个连接占用了另一个连接所需的数据库锁,则它可以阻塞另一个连接。如果两个或两个以上的连接相互阻塞,则它们都不能继续执行,这种情况称为死锁。

数据库死锁问题不易处理,这是因为涉及到的锁定通常不是显式的。通常,对数据行进行隐式更新时,需要锁定该数据行,执行更新,然后在提交或回滚封闭事务时释放锁。由于数据库平台、配置的隔离级以及查询提示的不同,获取的锁可能是细粒度或粗粒度的,它会阻塞(或不阻塞)其他对同一数据行、表或数据库的查询。

获取的锁依赖于内部生成的查询计划。当数据大小和分步随时间发生变化时,该计划也可能改变。这样在一个环境中获取一组锁的查询可以尝试在另一个环境中获取一组完全不同的锁。必要时,数据库可以随意地增加它的锁。例如,数据库可能会选择锁定整页,而不是锁定同一数据页中的10个数据行,这会阻塞对无需锁定的数据行的读写权限。

基于数据库模式,读写操作会要求遍历或更新多个索引、验证约束、执行触发器等。每个要求都会引入更多锁。此外,其他应用程序还可能正在访问同一数据库模式中的某些对象,并获取不同于您的应用程序所具有的锁。

所有这些因素综合在一起,数据库死锁几乎不可能被消除了。值得庆幸的是,数据库死锁通常是可恢复的:当数据库发现死锁时,它会强制销毁一个连接(通常是使用最少的连接),并回滚其事务。这将释放所有与已经结束的事务相关联的锁,至少允许其他连接中有一个可以获取它们正在被阻塞的锁。

由于数据库具有这种典型的死锁处理行为,所以当出现数据库死锁问题时,数据库常常只能重试整个事务。当数据库连接被销毁时,会抛出可被应用程序捕获的异常,并标识为数据库死锁情况。如果允许死锁异常传播到初始化该事务的代码层之外,则该代码层可以只启动一个新事务并重做先前所有工作。要正确使用此策略,则在事务成功提交之前,它的代码不能有其他操作。注意:要限制重试次数,否则易导致死锁的代码块会永久循环下去。

如果出现问题就重试,这种方法有点笨。但是,由于数据库可以自由地获取锁,所以几乎不可能保证两个或两个以上的线程不发生数据库死锁。此方法至少能保证在出现某些罕见的数据库死锁情况时,应用程序能正常运行。这比要求用户去重试操作要好得多。

在J2EE应用程序中,开发人员可以设置一个EJB调用以使用Bean托管事务(BMT)——开发人员启动、提交或回滚特定的事务或容器托管事务(CMT)——调用方法前启动事务,并在方法完成后提交或回滚事务。如果EJB供应商提供retry-on-deadlock参数,从而可以通过容器托管事务自动完成此操作,那当然再好不过了。如果没有这种自动功能,开发人员最终将仅为了对死锁进行重试而强制EJB调用使用Bean托管事务。

遇到死锁问题和锁定其他线程的锁的具体频率在很大程度上取决于数据库平台、硬件、数据库模式和查询。在使用基于锁的并发控制的数据库(如MSSQL)中,未提交的写操作会阻止读操作,而未提交的读操作会阻止写操作,使数据库更易出现死锁问题。在多版本并发控制(MVCC)数据库(如Oracle)中,未提交的写操作不阻止读操作——读操作仅查看旧版本数据行。这虽然会引入其他问题,但不会造成同样多的死锁机会。我们要让自己熟悉这些数据库锁定模式,并注意自己正在使用的类型。

在查找、修复以及避免数据库死锁方面,有一些很好的参考方法,但它们都不能彻底消除死锁的可能性。

时间: 2024-09-29 17:35:54

对J2EE中死锁问题的研究的相关文章

软件体系架构模式在J2EE中的应用

本文介绍了软件体系架构产生的背景和架构模式的基本理论.重点介绍管道与过滤器体系架构模式的结构,实现,优缺点等,然后以J2EE的Servlet Filter为例进行剖析它是怎样应用该架构模式的,最后简单阐述了在其它J2ee应用中(Jboss和Axis)的实践. 软件体系架构 1.软件体系架构产生背景 在经历60年代的软件危机之后,使人们开始重视软件工程的研究.来自不同应用领域的软件专家总结了大量的有价值的知识. 当初,人们把软件设计的重点放在数据结构和算法的选择上,如Knuth提出了数据结构+算法

在J2EE中APPLET和HTML作为客户端的比较

j2ee|比较|客户端 前言 在j2ee中,客户端常用的两中方式是html,和基于application的applet,因为采用的技术不同,这两个方式都有其优缺点,在考虑采用何种技术(或者两种都用),需要根据两种技术的特点,以及此项目的应用范围来综合考虑.以下分"易用性","性能","维护,扩展","交互","安全"五部分来说明各自的特点,并针对客户,开发人员角色阐明一下个人观点. 易用性 客户对于易用性要

行为地图在WAP流程中简单的可用性研究

文章描述:行为地图(Behavioral Mapping)在可用性研究中的应用探索. 概念+实战 一.概念篇--传统行为地图(Behavioral Mapping)的概念及应用范围 一种从时间和空间角度,系统的观察研究行为的方法.而这种从时间和空间角度还可以有两个维度进行观察:以人群或个体为观察单位.以地点为观察单位. 以人群或个体为观察单位(好像有点像狗仔队),观察人群/个体的行为.语言.行动路线等,得到关于这个人或这一个体的习性.性格特征等.这种观察更多的是用在动物或者小孩身上,因为当你观察

Oracle中Kill session的研究

oracle|session Oracle中Kill session的研究   作者: Eygle link: http://www.eygle.com/faq/Kill_Session.htm 我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: alter system kill session 'sid,serial#' ;   被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程

javaweb开发工具有哪些?j2ee中那些技术规范较为主流?

问题描述 javaweb开发工具有哪些?j2ee中那些技术规范较为主流? 目前已下载jdk,tomcat,Dreamweaver,myeclipse.技术规范打算先学servlet,jsp. 解决方案 Eclipse IDE for Java EE Developers 254 MB.在eclipse官方下载http://download.eclipse.org/或者myeclipse.冉要Licence破解,相对好用一点.如果开发的话,还要安装以下插件:1.maven插件2.svn插件3.gi

j2ee 中如何是checkbox达到.net中的enble不可用的功能

问题描述 j2ee中如何是checkbox达到.net中的enble不可用的功能js方法或者属性都可以麻烦各位大虾了 解决方案 解决方案二:加上这个标签属性disabled="True"解决方案三:js方法可以再j2ee中使用,怀疑解决方案四:checkboxId.Enabled=false?

关于j2ee中json接收和发送的一些问题【新人】

问题描述 关于j2ee中json接收和发送的一些问题[新人] 1.由于不用http协议,服务器要怎样调用接收json的方法,想了半天只想出一个写一个main()的方法,而不是一个类 2.接收和发送json的方法是什么.谢谢各位大神了 新人刚刚学完servlet 解决方案 C/S的还是B/S的?B/S还有不用http的吗? 解决方案二: servlet中传送JSON串,应该也有一个关于JSON的包,调用其中的方法,把你的串穿进去,就到前台了

j2ee中遇到下面的错误提示,是启动服务器的时候报的错。求解

问题描述 j2ee中遇到下面的错误提示,是启动服务器的时候报的错.求解 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 17 in

《中国人工智能学会通讯》——8.35 软件工程中的演化计算研究

8.35 软件工程中的演化计算研究 演化计算(Evolutionary Computation)是通过模拟生物进化过程与机制来求解问题的自组织.自适应的人工智能技术,在模式识别.机械工程.电气工程.生物学等众多领域都获得成功[1-2] .近年来,演化计算在软件工程领域也获得了广泛应用,形成了新的学科交叉方向--基于搜索的软件工程(SBSE,Search-Based SoftwareEngineering). 2001 年,Mark et al [3] 首次提出了"基于搜索的软件工程"的