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

问题描述

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

最近遇到一个棘手的问题,请教各位能否查明报出异常的原因:
1:正常情况下系统运行没有问题,但是系统访问高峰情况下会出现,日志如下,这段日志出现一段时间之后,应用就会假死,持续1分钟左右之后恢复。
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException
: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/datasources/PnrDS
The error may exist in com/huifu/muser/common/dal/dao/MerUsrMapMapper.xml
The error may involve com.huifu.muser.common.dal.dao.MerUsrMapMapper.queryMerUsrMap
The error occurred while executing a query
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: javax.resource.ResourceE
xception: IJ000453: Unable to get managed connection for java:jboss/datasources/PnrDS
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at com.sun.proxy.$Proxy157.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:195)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at com.sun.proxy.$Proxy158.queryMerUsrMap(Unknown Source)
at com.huifu.muser.service.core.cash.impl.CashReqServiceImpl.checkMerUsrMap(CashReqServiceImpl.java:267)
at com.huifu.muser.biz.cash.impl.CashReqManager2Impl.cashConfirmReq(CashReqManager2Impl.java:211)
at com.huifu.muser.webapp.controller.cash.CashController.cashConfirm2(CashController.java:200)
at sun.reflect.GeneratedMethodAccessor2127.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

2:我的应用框架是 spring3.0.5+mybatis3.1.1+JBoss7.1+oracle11+jdk1.6
3:负载均衡 netscaler,两台虚拟机,四核,内存8G,jvm启动参数配置如下:
-XX:+UseCompressedOops -XX:+TieredCompilation -Xms4096m -Xmx4096m -Xmn1024m -XX:PermSize=256M -XX:MaxPermSize=512M -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Xnoclassgc -XX:+CMSClassUnloadingEnabled
4:我的数据库链接池是配置在jboss的配置文件standalone-ha.xml中,连接池配置为18-300,高峰期能达到300,即应用确实与数据库建立300链接,但是活跃链接在15左右,配置如下

解决方案

Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection;
看下你的jdbc的最大连接数是多少?

解决方案二:

http://stackoverflow.com/questions/19527527/org-springframework-jdbc-cannotgetjdbcconnectionexception-could-not-get-jdbc-nn

解决方案三:

jdbc最大连接数多少?提供片段读取写入的代码,看一下你重用连接的代码。

解决方案四:

查看一下数据库的日志 里面一般有描述当前数据库连接的问题等 看是连接数太多还是数据处理问题

解决方案五:

" 连接池配置为18-300,高峰期能达到300 "

说明高峰期瞬间连接数确实可能超过300,那你分别把配置文件中max-pool-size调大一点,比如到400或500,然后确认Oracle最大进程数够用;再试试就可以了。

解决方案六:

http://stackoverflow.com/questions/17469743/no-managed-connections-available-within-configured-blocking-timeout-jboss-7-and

https://developer.jboss.org/thread/211940?start=0

解决方案七:

直接原因就是 CannotGetJdbcConnectionException

当数据库连接到了设定最大值时,再想获得连接,就出错了

一方面,要检查是否有连接用完没关闭的情况

如果没问题,那么就要加大最大连接数了

你可以监控一下数据库本身,如果忙得时候很慢,会导致很多连接无法及时完成而无法释放,此时加大连接数只能更糟糕
这时你只能优化数据的软硬件和应用本身了

时间: 2025-01-23 12:06:39

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

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

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

用连接池提高Servlet访问数据库的效率(1)_JSP编程

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

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

servlet 三.类DBConnectionPool说明 该类在209至345行实现,它表示指向某个数据库的连接池.数据库由JDBC URL标识.一个JDBC URL由三部分组成:协议标识(总是jdbc),驱动程序标识(如 odbc.idb.oracle等),数据库标识(其格式依赖于驱动程序).例如,jdbc:odbc:demo,即是一个指向demo数据库的JDBC URL,而且访问该数据库要使用JDBC-ODBC驱动程序.每个连接池都有一个供客户程序使用的名字以及可选的用户帐号.密码.最大连

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

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

【最近面试遇到的一些问题】数据库连接池的优点和原理,常用的java开源连接池组件

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

Netty的http client连接池设计

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

高并发服务器的设计之连接池的设计

高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计 主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒,设计 人员不得不去考虑这些. 比如数据库连接池(sql pool),是通过TCP来通信的,属于IO类,有 一定的延时,在高并发系统中频繁的创建会严重影响系统性能. 内存( mem )的分配是要涉及锁 ( mutex )的,有锁就会有延时,因此可以在开始申请一大块内存,后面进行分配与释放,来节省锁开 销. 服务器的连接处理不仅

14-数据库连接池和jdbc优化

一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.宕机.   解决方案就是数据库连接池 连接池就是数据库连接对象的一个缓冲池 我们可以先创建10个数据

druid 连接池溢出 getconnectiontimeoutexception

问题描述 tomcat异常显示:严重:Servlet.service()forservletspringMvcthrewexceptioncom.alibaba.druid.pool.GetConnectionTimeoutException:loopWaitCount2,waitmillis60678atcom.alibaba.druid.pool.DruidDataSource.pollLast(DruidDataSource.java:1297)atcom.alibaba.druid.po