较为简单的连接池泄露 解决思路

由于是金融公司,所以不便透露代码和系统名称。

背景描述

1) A系统的UAT环境会推送数据到B系统。

2)由于系统间没有采用消息中间件进行解耦,B系统的连接池出现泄露导致A系统功能也受到影响。

3)生产环境没有出现问题。

4)服务器为IBM外包管理,无权查看JVM的DUMP,无权登录到服务器机器。

5)连接池并非马上全部泄露,而是渐渐的被吃掉。

采用技术框架:

SEAM+SPRING+HIBERNATE

数据库ORACLE RAC

诊断:

由于生产环境并没有发现问题,大概率可以断定是由于数据问题导致。从DBE团队提供的一份数据来看,几乎所有的连接SESSION都是执行了某一个同样的SQL(Hibernate生成)后,卡死。

1)追踪到SQL,从SQL追踪到Hibernate,然后找到了相应的代码。(运气较好,此段SQL只出现在了我们一处代码上面,很容易就锁定了泄露嫌疑区域)

由于所有的SESSION卡在A,所以断定应该是检查数据的过程出现问题。于是进行查看。

锁定原因:

红色区块检查数据的代码中,抛出了一个运行时的异常。

很可惜,外部的手动管理的事务压根没有做try catch进行回滚事务操作。异常被线程池捕获处理,连接并没有返回到连接池。

最后还是要澄清一下,这代码不是我写的。。。。。

在无法实时查看JVM的情况下,DBE团队提供的数据起了很大的帮助。

追踪泄露了的SESSION最后执行的SQL,也是一个非常好的起点。

时间: 2024-10-18 10:31:09

较为简单的连接池泄露 解决思路的相关文章

JDBC学习笔记——简单的连接池

1.使用LinkedList保存连接                                                                即使是最简单的JDBC操作,也需要包含以下几步:建立连接.创建SQL语句.执行语句.处理执行结果.释放资源,其中建立连接步骤是很耗费计算机性能的,如果我们每次进行JDBC操作都创建新的JDBC连接,使用完后再立即释放连接,这样做会耗费大量性能.更合理的做法应该是:创建JDBC连接,使用JDBC连接,使用完后不是立刻释放JDBC连接,而

关于sqlserve2000和sqlserver2005以后版本配置连接池的一些思路

其实网上关于这个内容的东西也有很多,方法很不少,我也不敢班门弄斧. 就写一下自己在照着网上资料配置过程中的一些思路. 一:修改server.xml 文件 tomcat-6.0\conf 文件夹 下面的server.xml文件中的最后一个</host>前面添加代码如下:<Context path="/" docBase="" debug="5" reloadable="true" corssContext=&q

【转帖】置高并发jdbc连接池

简单的MySQL连接池 [html] view plaincopy <Resource type="javax.sql.DataSource" name="jdbc/TestDB" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://lo

JAVAWEB开发之事务详解(mysql与JDBC下使用方法、事务的特性、锁机制)和连接池的详细使用(dbcp以d3p0)

事务简介 事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功 在开发中,有事务的存在,可以保证数据的完整性. 注意:数据库默认事务是自动提交的,也就是发一条SQL 就执行一条.如果想多条SQL语句放在一个事务中执行,需要添加事务有关的语句. 如何开启事务? 事务的操作方式: 创建表: create table account( id int primary key auto_increment, name varchar(20), money double

连接池的复习

数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection(因为连接池对Connection使用了装饰模式),而是把Connection“归还”给池.池就可以再利用这个Connection对象了. JDBC数据库连接池接口(DataSource) Java为数据库

JDBC二部曲之_事物、连接池

事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l  一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致.如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的. l  隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰. l  持久性(Durabil

《java数据源—连接池》

<java数据源-连接池>1.数据源的分类:直接数据源.连接池数据源.2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接. b.连接池:简单的说就是保存所有的数据库连接的地方,在系统初始化时,将数据库连接对象存储到内存里,当用户需要访问数据库的时候,并不是建立一个新的连接,而是从连接池中 取出一个已经建立好的空闲连接对象.而连接池负责分配.管理.释放数据库连接对象.注意的是:连接池是由容

MySql &amp; JDBC &amp; 连接池 &amp; 总结

连接池:解决资源浪费,提高代码性能. 本小节目标: 使用DBCP,C3P0连接池完成基本数据库的操作. 使用DBUtils完成CRUD的操作. 数据库连接池的解决方案是: 当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池.每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池.通过使用连接池,将大大提高程序的运行效率. 数据库连接池是Connection 对象的工程.数据库连接池的常用参数

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方式

本文提供了对c3p0与DBCP连接池连接MySql数据库时. 8小时内无请求自己主动断开连接的解决方式.首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方式. 基本问题解决 项目环境: Java Web项目框架为Spring MVC+JPA,使用c3p0连接池,公布环境为Tomcat 7 错误描写叙述: 项目执行一段时间(大概几个小时)之后訪问时会出现第一次訪问报错,再次訪问正常的现象.且多次出现此问题. 报错日志: org.springframework