Trouble Shooting -- WebSphere 连接池不够使用的问题

之前公司有个把新创建的ABS产品发送到外部媒体验证的小项目(需要在项目中记录验证状态信息,存储在数据库中,使用openjpa做持久层实现)。花了个把月的时间搞定了,产品上线运行之后(部署Websphere),爆出了一次数据库连接池不够用的问题,出现以下异常:

com.ibm.websphere.ce.j2c.ConnectionWaitTimeoutException: Connection not available, Timed out waiting for 180007

我们的连接池配置了最大10个连接,最大等待时间是默认的180s。出现这个问题让我感到很意外,系统最开始设计的时候需求里写明的是10分钟内最多7-8个请求(10分钟是因为一个请求处理需要5~10分钟,涉及到4次数据库写+n次数据库读+n次smb读+1次smb写)。在系统集成测试的时候(部署tomcat)试过同样的连接池配置同时处理30个请求都没有问题。赶紧查询了一下出问题的时候系统状态,显示只是同时有12个请求,这就让我感觉很奇怪了,为什么会出现连接池都用光了的情况。因为一个请求存在的时间比较长,数据库连接的获取和释放都做了小心处理。代码中的连接池获取和释放都是交给了Spring transaction,每次数据库读写都是单独的事务,没有理由会出现连接池不释放的情况,在测试环境中JavaSimon的监控数据也显示了数据连接池最长占用时间不过2秒多。

因为对websphere不够熟悉,只好赶紧去查看websphere的文档,发现了可疑之处,在web.xml中写resource reference的时候连接池我使用了默认的shareable模式,而在websphere的文档中写明shareable代表这在应用和连接池中间又加多了一层connection维护者,shareable资源在短请求多次使用连接的时候很有用,对我这种长请求间隔使用几次数据库连接反而引起严重副作用,连接被占住不释放,将连接池资源使用方式改成unshareable之后,问题得到解决。

* *

One key point regarding this behavior is that when the application

closes a shareable connection, the connection is not truly closed, nor

is it returned to the Free pool. Rather, it remains in the Shared

connection pool, ready for another request within the same LTC for a

connection to the same resource

**

Note:在调查过程中,有人查询openjpa的connection usage文档建议把entitymanager改成使用单个connection,显然是对entitymanager的容器管理理解不够,entitymanager不是线程安全的,spring注入的是线程安全的实例(threadlocal)。

时间: 2024-10-09 05:59:47

Trouble Shooting -- WebSphere 连接池不够使用的问题的相关文章

(转)WebSphere 中池资源调优 - 线程池、连接池和 ORB

WebSphere 中池资源调优 - 线程池.连接池和 ORB 来自:https://www.ibm.com/developerworks/cn/websphere/library/techarticles/1106_zhuxl_websphereenhancement/1106_zhuxl_websphereenhancement.html IBM WebSphere Application Server (以下简称 WAS)能支持的应用程序越来越多,而这些应用程序有各自的独特特性.需求和服务

JDBC 连接池

数据库连接池(connection pool) JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开发,存在的问题: 数据库的连接资源并没有得到很好的重复利用. 对于每一次数据库连接,使用完后都得断开. 这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃. 数据库连接池 数据库连接池的基本思

几个主流的Java连接池整理

池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象.需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用.其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能. 要了解Java连接池我们先要了解数据库连接池(

连接池(转载)

1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术.在Web应用开发的早期,主要使用的技术是CGI﹑ASP﹑PHP等.之后,Sun公司推出了基于Java语言的Servlet+Jsp+JavaBean技术.相比传统的开发技术,它具有跨平台

连接池配置 - tomcat7

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个 应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时 间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏.这项技术能明显提高对数据库操作的性能. 数据库连接池在初始化时将创建一定数量的数据库连

几个主流java连接池

池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象.需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用.其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能. 要了解Java连接池我们先要了解数据库连接池(

Spring下配置几种常用连接池

1.连接池概述 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏.这项技术能明显提高对数据库操作的性能. 数据库连接池在初始化时将创建一定数

Java进阶学习第十八天——事物与连接池

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.05.13 lutianfei none 事务 事务的概念 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不成功. 在开发中,有事务的存在,可以保证数据完整性. 例如:A--B转帐,对应于如下两条sql语句 update account set money=money-100 where name='a'; update account set money=money+100 whe

连接池的基本工作原理

1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配?释放所造成的问题.为解决上述问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为数据库连接 建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定 连接池最大连接数来防止系统无尽的与数据库连接.更