weblogic92连接池的连接数异常问题

有客户说,他们通过connection pool监控发现weblogic92连接池中当前连接数(current capacity)小于初始连接数(initial capacity)。从现象上来说,给客户的直觉是:连接池初始化有问题,没有帮助他们初始化他们需要的那么多连接。但他同时发现,几个 connection pool中,其他pool没有问题。拿到问题,我也怀疑这可能是weblogic的一个bug,但随后从客户发送过来的日志中发现出问题的 connection被disable过。调查后发现问题的确和这个pool被disable过有关,那么为什么pool被disable后,会出现这样的问题呢?

首先我们看看这个pool为什么会被disable? 手工强制suspend连接池、数据库关闭、网络不稳定等因素都可能成为connection pool被disable的诱因。从客户的日志中,我能看到大量的如下异常,

1:java.net.SocketException: 管道已断开 (errno:32)

2:weblogic.common.resourcepool.ResourceDisabledException: Pool JDBC Data Source-0 is disabled, cannot allocate resources to applications.

根据上面的异常,首先跟客户确认是否存在过数据库关闭、强制disable connection的操作,这些都被客户否定了,那么最大可能的原因就是网络不稳定,网络是好时坏的话,很容易造成weblogic连接池中到 database server的连接中断,从而导致connection pool被disable。

那么为什么连接中断会引起connection pool被disable呢?这里要谈到两个参数:CountOfTestFailuresTillFlush、 CountOfRefreshFailuresTillDisable。这两个参数在weblogic连接池实现中由于控制是否、何时flush或 disable连接池,两个都是指连续几次失败操作(test、refresh)后去flush或disable connection pool。注意:这是说的是连续,而不是间断,每次成功操作(test、refresh)后,这两个值都会被reset成0。默认情况下这两个值均为2,即连续失败3(2+1)次后,connection pool会被flush或disable。两者的区别在于,flush用于清空connection pool中的所有连接(通常都是中断的connection),当pool状态仍保持在running状态,而对于后者,connection pool将会变成suspend。前者对于客户端而言,还可以从pool中reserve connection,reserve时,weblogic会尝试重现创建连接,如果创建连接成功,那么客户端就可以拿到可用的连接。而对于一个处于 suspend状态,客户端reserve connection的请求会直接被拒绝,收到的异常如下:

weblogic.common.resourcepool.ResourceDisabledException: Pool JDBC Data Source-0 is disabled, cannot allocate resources to applications

一个被disable的connection pool我们需要手工resume吗?比如数据库因为某些原因而突发关闭,数据库恢复后,我们是否需要手工去resume这个pool?不需要,weblogic内部实现了连接池的自我健康检查功能,对于disable的connection pool,weblogic会每隔5秒钟(DEFAULT_SCAN_UNIT)去做一次连接尝试(尝试创建一个物理连接,如果连接成功,那么这个连接会被直接放入连接池中,我们的问题就处在这儿),我们通过下面的复现过程来看看具体原因:

1:配置一个datasource,connection的连接数具体配置如下:

2:weblogic启动后,我们可以看到current capacity为15,此时connection pool刚被初始化,weblogic会根据initial capacity去创建相应数量的连接。此时如果我们关闭数据库,然后通过测试程序去获取连接,你会看到我们无法拿到连接(注意我们要选上 TestOnReserve),重复三次,再次去监控connection pool。因为三次test失败后,connection pool会被disable(状态为suspend),如下:

3:重启database。由于weblogic内部实现了connection pool的自检功能,对于disabled的connection pool,weblogic每隔5秒钟去做一次连接尝试,如果连接创建成功,新建连接会被放入连接池,同时resume连接池。通过监控我们可以看到,连接池状态变成running,同时current capacity变成1,

时间: 2025-01-23 09:26:41

weblogic92连接池的连接数异常问题的相关文章

JBoss连接池

问题描述 jboss自带连接池?我觉得像tomcat一样,用第三方连接池呢,比如dbcp或者c3p0.那么请问在比较大的项目中用jboss自带连接池好一些,还是配置c3p0好一些?jboss自带连接池我看了一下怎么那么像jndi,好像仅仅一个连接似的?它的连接池默认连接数是多少? 解决方案 默认min=5,max=20,好不好由项目决定的,三方中间件可移值性强,如果是生产环境下,如楼上说建议使用自带的,可以结合JBOSS进行调优,比如默认大小并不一定是生产环境下的最佳参数,这需要监控SQL的请求

连接池-在系统访问高峰期出现无法获取数据库连接的异常

问题描述 在系统访问高峰期出现无法获取数据库连接的异常 最近遇到一个棘手的问题,请教各位能否查明报出异常的原因: 1:正常情况下系统运行没有问题,但是系统访问高峰情况下会出现,日志如下,这段日志出现一段时间之后,应用就会假死,持续1分钟左右之后恢复. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: Error quer

连接池和 Timeout expired异常解决方法

连接池和 timeout expired异常解决方法 你需要保证你每次调用连接的同时都在使用过后通过close()或dispose()对其执行了关闭.最简单的办法就是使用using,将你的连接泄漏方法修改成如下面的代码样式: public void doesnotleakconnections()     {            using (sqlconnection sqlconnection1 = new sqlconnection("server=.sqlexpress ;integr

C3p0连接可以设定最大连接数么?连接池中最多可以存在的连接个数?

问题描述 C3p0连接可以设定最大连接数:连接池中最多可以存在的连接个数?如果没有这个参数,连接太多的话,数据库岂不承受不了. 问题补充:caizi12 写道 解决方案 不是空闲的,是指整个连接池总共的连接数,至于连接是使用还是空闲,是C3P0在使用时自己去管理的如果请求连接数超出了连接池数量的话,需要等待有连接从使用返回空闲状态才能继续分配但是有一个问题是lz需要考虑的:1. 使用连接池需要有良好的上层构架,要保证对数据库连接的使用被限制在最小范围,一旦连接使用完毕要及时而快速的归还给连接池2

java的连接池问题,总是报异常,请指教

问题描述 数据中心日志-创建完成-数据中心特殊路径加载-创建完成-数据中心数据交换核心-创建完成-C3P0连接池出现异常-zfdxc:NamezfdxcisnotboundinthisContext-连接池创建-JNDI初始化失败!-c3p0PropertiesPath:-D:ProgramFileapache-tomcat-6.0.16webappszfdxcWEB-INF/c3p0.properties-c3p0Propertieserror:-D:ProgramFileapache-tom

Netty的http client连接池设计

1 复用类型的选型 1.1 channel 复用 多个请求可以共用一个channel 模型如下:                                                特点: callback队列为回调队列. 不同的callback通过一个全局的id进行标识.发送的时候会把该id发到服务端,服务端在回复的时候必须把该id再返回到客户端. 获取连接只需要随机获取一个channel即可,将callback添加到队列里面.  获取连接时消除了锁的竞争,性能高效. 结构简单.  

用连接池提高Servlet访问数据库的效率 (-)

servlet|访问|数据|数据库 Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍一种充分发挥该特色的实用技术,即数据库连接池. 一.实现连接池的意义 动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问.连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证.安全上下文配置这类任务,因而往往成为最为耗时的

什么是连接池,其工作原理是什么?

连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用.当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接.当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务. 连接池的主要优点有以下三个方面. 第一.减少连接创建时间.连接池中的连接是已准备好的.可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间. 第二.简化的编程模式.当使用连接池时,每一个单独的线程能够像创建一个自己的JDBC连接一样操作,允许用户直接使用JDBC编

Http请求连接池 - HttpClient 连接池

两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已经建立好的http连接,这样花费就比较小,吞吐率更大. 传统的HttpURLConnection并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象.对于网络请求这种底层相对复杂的操作,个人以为如果有可用的其他方案,也没有必要自己去管理连接对象. 除了HttpURLConnection,大家肯定还知道Ht