`
gdpglc
  • 浏览: 87537 次
  • 性别: 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 update数据库死锁之获取数据库连接池等待的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Asp 操作Access数据库时出现死锁.ldb的解决方法

    在百度上搜索了一下这方面的情况,结果也不少,总结下来主要都是因为对数据库存取完后,没有及时释放记录集和断开数据库连接,以下谈谈操作Access数据库的标准方法: 1、数据库连接方法:Conn.asp <% dim ...

    DELPHI7写的ADO连接池

    自己开发中用到的ADO连接池,可避免多客户访问SQL数据库导致死锁等问题。

    oracle 12c 数据库 教程

    (五)建立连接的方法 36 (六)共享服务器模式 38 (七)分布式数据库基础 40 五、管理用户和权限 42 (一)用户 42 (二)权限 46 (三)角色 51 (四)概要文件:Profile 54 六、管理数据库存储结构 57 (一)...

    KETTLE常见问题和优化

    KETTLE常见问题和优化

    100道mysql的面试题

    MySQL事务得四大特性以及实现原理,如何写sql能够有效的使用到复合索引,数据库自增主键遇到的问题,MVCC,主从同步延迟,为什么需要数据库连接池, InnoDB引擎中的索引策略,Blob和text有什么区别,Mysql中有哪几种...

    诊断 Java 由 Synchronizer 和 AQS 混合组成的死锁

    原文链接: http://www.tianxiaohui.com/index.php/SRE/诊断-Java-由-Synchronizer-和-AQS-混合组成的死锁.html 死锁问题在 SRE 的日常的应用诊断中, 经常遇到. 遇到的大多数, 都是通过 thread dump 里面明显看到的,...

    oracle数据库经典题目

    PGA区是在用户进程连接数据库,创建一个会话时,由Oracle为用户分配的内存区域,保存当前用户私有的数据和控制信息,因此该区又称为私有全局区。每个服务器进程只能访问自己的PGA区,所有服务器进程PGA区总和即为...

    mysql数据库my.cnf配置文件

    # 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 #skip-networking back_log = 600 # MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用, # ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    1.3 开发数据库应用的正确(和不正确)方法 8 1.3.1 了解Oracle体系结构 8 1.3.2 理解并发控制 14 1.3.3 多版本 19 1.3.4 数据库独立性? 25 1.3.5 “怎么能让应用运行得更快?” 41 1.3.6 DBA与开发人员的关系...

    Sybase ASE快速参考手册

    2.3 查找定位数据库服务器性能问题的常用工具和方法? 13 2.4 开发数据库应用时需要开发人员重点关注的几个问题? 16 2.5 如何在Windows 平台上启动和关闭Sybase数据库服务器? 16 2.6 如何在UNIX平台上启动和关闭...

    ORACLE9i_优化设计与系统调整

    §9.5.4 数据库物理设计内容和步骤 103 §9.6 开发过程管理 104 §9.6.1 应用软件生命周期阶段的管理 105 §9.6.2 成功的三要素 106 §9.6.3 培植过程 106 §9.6.3.1 定义环境 107 §9.6.3.2 角色定义 107 §9.6.3.3...

    Sybase ASE快速参考手册.pdf

    2.3 查找定位数据库服务器性能问题的常用工具和方法? 14 2.4 开发数据库应用时需要开发人员重点关注的几个问题? 18 2.5 如何在Windows 平台上启动和关闭Sybase数据库服务器? 18 2.6 如何在UNIX平台上启动和...

    2023Java高频面试题

    JDBC:Java与数据库的交互,连接池的使用等。 Spring框架:Spring框架的基础概念、IOC容器、AOP等。 Hibernate框架:Hibernate框架的基础概念、ORM映射、HQL查询等。 Servlet与JSP:Web开发的基础知识、Servlet和JSP...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     19.1.2 使用配置文件指定的数据库连接池  19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置...

    Oracle数据库日常维护手册

    4.2. 检查数据库连接情况............................................................................................... 11 4.3. 检查系统磁盘空间............................................................

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     19.1.2 使用配置文件指定的数据库连接池  19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     19.1.2 使用配置文件指定的数据库连接池  19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     19.1.2 使用配置文件指定的数据库连接池  19.1.3 从容器中获得数据源  19.1.4 由Java应用本身提供数据库连接  19.2 配置事务类型  19.3 把SessionFactory与JNDI绑定  19.4 配置日志  19.5 使用XML格式的配置...

Global site tag (gtag.js) - Google Analytics