`
gdpglc
  • 浏览: 90784 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

数据库连接池死锁的原因和处理方法

阅读更多

数据库连接池是java软件常用的组件,但对数据库连接池不正确的使用会造成软件的死锁。
死锁的产生原理是:存在线程同时占有两个以上的连接对象的情况。

比如某连接池中有2个连接对象。
有两个线程分别占用了一个,又分别来申请另一个。这时由于连接池空,而两个线程本身都卡在连接池上,不可能释放原来占有的连接对象,这时产生死锁。

连接池死锁,会导致软件和数据库相关的部份无响应。比如登陆功能,会用数据库做用户校验,发生连接池死锁后,登陆功能会无法使用(点登陆按钮后,长时间无相应)。

连接池死锁的问题可以参看以下文章:

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fprogram%2Fdatapool.htm

解决方法:一个线程中同时只允许使用一个连接对象。

一段数据库逻辑通常只需要一个连接对象,因此在一个方法中实现这点是比较容易的。但是当发生如下情形时则比较麻烦:
有两个方法A和B,A和B都要使用数据库连接,而A在事务中调用了B。

为了解决这个问题有如下两种办法:

一是,将连接对象放在线程的ThreadLocal中。这样A和B即可共享连接对象了。但这种方法需要考虑嵌套事务的问题。数据库是不允许嵌套事务的。因此,要么避免嵌套事务,要么自动合并事务。
注意:采用传参的形式也可以做到这点,但只能就问题解决问题,不是框架层面的解决方案,也要处理嵌套事务的问题。

二是,直接人为在代码上保证一个线程不同时占有两个连接对象。幸好这样的情况从经验上看并不多,只要找到这样的方法,想办法拆分一下逻辑,将调用的部份从事务中拿出来即可。

     还有一种古怪的办法,就是新起一个线程来调用B。如果A对B的返回值有依赖关系,这种办法是行不通的,不推荐使用。

    有人认为只要给连接池设置一个超时就行了。可是,这样做并不恰当。因为,连接是应该可以共享的,如果暂时,连接池内没有连接可用,应该让申请者等待可用的连接,而不是抛出超时异常,这样会导致申请者整个过程的失败。

 

 

2012-02-02

 

新发现了一种由连接池引起的死锁情况,并不是由一个线程占用两个以上的连接引起的,是因为线程取得连接后被锁卡住不能归还引起的方式如下:

 

连接池中有一个连接对象。

 

A线程:

取得连接对象

开始事务

synchronized(cache){

    数据库代码

}

提交

关连接

 

B线程:

synchronized(cache){

   取得连接,操作数据库。

}

 

A线程执行卡在同步块外,此时连接池为空。

B线程进入同步块,在取得连接时卡在连接池上。

 

 

 

 

2
1
分享到:
评论
1 楼 eyesmore 2012-04-03  
"比如某连接池中有2个连接对象。
有两个线程分别占用了一个,又分别来申请另一个。这时由于连接池空,而两个线程本身都卡在连接池上,不可能释放原来占有的连接对象,这时产生死锁。 "

这句话应该是错误的,依据我的经验,这个时候不会死锁,只是两个线程都WAITING(如果连接池配置的时候当连接不够用的时候,等待的话)。你可以做个简单的实验,然后用jstack查看线程情况。

相关推荐

    数据库连接池~~~数据库连接池

    数据库连接池是现代应用程序开发中的一个关键概念,它在提高应用程序性能、管理和优化数据库资源方面起着重要作用。数据库连接池的基本思想是预先创建并维护一定数量的数据库连接,这些连接可以被多个应用程序线程...

    Mybatis update数据库死锁之获取数据库连接池等待

    【Mybatis更新数据库死锁与获取数据库连接池等待】是一个常见的技术问题,涉及到数据库事务处理、并发控制以及数据库连接管理。以下将详细解释这两个问题及其解决方案。 **1. MySQL数据库死锁** 数据库死锁通常...

    数据库连接池相关jar包和数据库驱动jar包

    - `c3p0-0.9.1.2.jar`:C3P0是一个开源的JDBC连接池,它不仅提供了数据库连接池的功能,还包含了一些其他的特性,如自动检测死锁、自动重试失败的连接等。 - `commons-dbutils-1.4.jar`:Apache Commons DbUtils是一...

    数据库连接池

    数据库连接池是现代应用程序开发中的重要组成部分,它在提高数据库操作效率、节省系统资源和管理数据库连接方面扮演着关键角色。本篇文章将深入探讨两个常用的数据库连接池实现:c3p0-0.9.1.2 和 commons-dbcp-1.4。...

    数据库连接池C3P0,jar包

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量并发数据访问时,它能有效管理和复用数据库连接,提高系统性能。C3P0是一个开源的Java数据库连接池实现,它提供了一种灵活且功能丰富的数据库连接...

    JNDI数据库连接池

    在Tomcat 6.0这个流行的Java Servlet容器中,JNDI被用来配置和管理应用的数据库连接池。Tomcat支持多种数据库连接池实现,如Apache DBCP、C3P0以及HikariCP等。这些连接池通过JNDI服务注册到Tomcat的Context环境中,...

    数据库连接池项目相关资料

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量数据交互的应用中,它扮演着优化数据库性能、提高系统效率的角色。本项目相关资料主要涵盖了数据库连接池的基本概念、工作原理、常见实现以及如何...

    数据库连接池资料java

    数据库连接池是Java开发中处理数据库连接的一种高效策略,它主要解决了频繁创建和销毁数据库连接导致的性能损耗问题。在Java中,常见的数据库连接池实现包括DBCP、C3P0以及更现代的HikariCP等。下面将详细介绍数据库...

    常用数据库连接池 (DBCP、c3p0、Druid) 配置说明1

    数据库连接池是现代Java应用程序中不可或缺的组件,它在提高应用性能、管理和优化数据库连接方面发挥着重要作用。本文主要探讨了三个常用的数据库连接池:DBCP、c3p0和Druid,以及它们的配置说明。 1. **DBCP...

    jdbc数据库连接池工程文件_e3p0

    这就是数据库连接池技术的出现原因。本篇将深入探讨`JDBC(Java Database Connectivity)`数据库连接池,特别是其中的`e3p0`连接池实现。 首先,`JDBC`是Java标准API,用于与各种数据库进行交互。它提供了统一的...

    c3p0数据库连接池所需jar包

    C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,数据库连接池扮演着非常重要的角色,它能够有效地管理数据库连接,提高系统性能,减少数据库资源...

    DELPHI7写的ADO连接池

    DELPHI7编写的ADO连接池是数据库应用开发中的一个重要技术,它主要用于管理和优化数据库连接,提高系统性能并防止可能出现的死锁问题。在多用户同时访问SQL数据库时,如果没有有效的连接管理,可能会出现资源竞争,...

    HikariCP数据库连接池所需jar包

    HikariCP数据库连接池是Java开发中广泛使用的高性能数据库连接池组件,其设计目标是提供极低的空闲连接开销、极快的连接获取速度以及高度的并发性能。这个压缩包文件包含了运行HikariCP所需的核心库,使得开发者能够...

    JSP数据库连接池的研究与实现(源代码+LW).zip

    本项目“JSP数据库连接池的研究与实现”提供了完整的源代码和LW(可能指的是 Lightweight 或者 Log Wizard),非常适合进行毕业设计或课程设计的学习参考。 首先,我们要理解JSP(JavaServer Pages)的角色。JSP是...

    数据库连接池在web开发中的应用

    数据库连接池在Web开发中的应用是提高应用程序性能和效率的关键技术之一。数据库连接池是一种管理数据库连接的机制,它允许开发者在多个请求之间重用已建立的数据库连接,而不是为每个请求都创建新的连接。这大大...

    java数据库连接池-bonecp java源码

    Java数据库连接池(Database Connection Pool)是Java应用中用于管理数据库连接的重要技术,它通过复用已存在的数据库连接,减少了创建和销毁连接的开销,从而显著提升了应用程序的性能和效率。BoneCP是一款高效的...

    实现高效的数据库连接池(附带完整代码C#和Java实现).docx

    【数据库连接池】是数据库管理中的重要组成部分,用于优化数据库操作效率和系统资源利用。连接池的基本原理是在程序启动时创建一定数量的数据库连接,并将其存储在一个“缓冲池”中。当应用程序需要与数据库交互时,...

    连接mysql和oracle的连接池包

    在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要工具。本压缩包提供了连接MySQL和Oracle数据库的连接池组件,使得开发人员能够在同一应用中便捷地处理这两种不同的数据库系统。 1. **连接池的概念**...

    JDBC数据源连接池的配置和使用示例

    - Druid:阿里巴巴开源的数据库连接池,提供了监控和扩展功能,广泛应用于各种Java Web项目。 ### 3. 配置数据源连接池 以HikariCP为例,我们可以通过以下步骤配置数据源: 1. 添加依赖:在`pom.xml`文件中添加...

Global site tag (gtag.js) - Google Analytics