c3p0--常见异常

  1. 获取资源timeout:


    异常信息如下:

    ?





    1

    Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.<br>[Cause: com.mchange.v2.resourcepool.TimeoutException: <br>A client timed out while
    waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@4d5a39b7
    -- timeout at awaitAvailable()

    查找发现,获取connection资源timeout的地方,在basicResourcePool类的awaitAvailable方法里,代码很简单:


     1 private void awaitAvailable(long timeout) throws InterruptedException, TimeoutException, ResourcePoolException
    2 {
    3 assert Thread.holdsLock( this );
    4
    5 if (force_kill_acquires)
    6 throw new ResourcePoolException("A ResourcePool cannot acquire a new resource -- the factory or source appears to be down.");
    7
    8 Thread t = Thread.currentThread();
    9 try
    10 {
    11 acquireWaiters.add( t );
    12
    13 int avail;
    14 long start = ( timeout > 0 ? System.currentTimeMillis() : -1);
    15 if (Debug.DEBUG && Debug.TRACE == Debug.TRACE_MAX)
    16 {
    17 if ( logger.isLoggable( MLevel.FINE ) )
    18 logger.fine("awaitAvailable(): " +
    19 (exampleResource != null ?
    20 exampleResource :
    21 "[unknown]") );
    22 trace();
    23 }
    24 while ((avail = unused.size()) == 0)
    25 {
    26 // the if case below can only occur when 1) a user attempts a
    27 // checkout which would provoke an acquire; 2) this
    28 // increments the pending acquires, so we go to the
    29 // wait below without provoking postAcquireMore(); 3)
    30 // the resources are acquired; 4) external management
    31 // of the pool (via for instance unpoolResource()
    32 // depletes the newly acquired resources before we
    33 // regain this‘ monitor; 5) we fall into wait() with
    34 // no acquires being scheduled, and perhaps a managed.size()
    35 // of zero, leading to deadlock. This could only occur in
    36 // fairly pathological situations where the pool is being
    37 // externally forced to a very low (even zero) size, but
    38 // since I‘ve seen it, I‘ve fixed it.
    39 if (pending_acquires == 0 && managed.size() < max)
    40 _recheckResizePool();
    41
    42 this.wait(timeout);
    43 if (timeout > 0 && System.currentTimeMillis() - start > timeout)
    44 throw new TimeoutException("A client timed out while waiting to acquire a resource from " + this + " -- timeout at awaitAvailable()");
    45 if (force_kill_acquires)
    46 throw new CannotAcquireResourceException("A ResourcePool could not acquire a resource from its primary factory or source.");
    47 ensureNotBroken();
    48 }
    49 }
    50 finally
    51 {
    52 acquireWaiters.remove( t );
    53 if (acquireWaiters.size() == 0)
    54 this.notifyAll();
    55 }
    56 }

    抛出异常的是第44行,而抛出异常的先决条件就是timeout了。表象来看是这样,再继续跟进代码的时候发现,进入等待资源的先决条件是:

    ?





    1

    2

    3

    1、available==0(unused==0

    2、managed。size>=max(池数量已达到最大)

    3、获取到的资源异常:如果设置了checkedoutTest这一项时,进行test的时候失败,导致异常;

    所以更直接的原因是以下几种:

    ?





    1

    2

    3

    1、请求资源的队列太长,排队时间太长导致超时:线程数量应付不过来大量的请求数量,导致超时

    2、testConnection的原因导致的异常:网络震荡

    3、数据库服务器端无更多的链接可用

    那么相应的解决方案:

    ?





    1

    2

    3

    4

    1、请求资源过长的,加大maxsize,如果请求量过大的,尽量将min和max设置成一个值,因此不存在shrink和expand的操作,这也是一种性能消耗

    2、testConnection设置在checkin即可,checkout时无需test,否则卡在网络震荡就不好了

    3、检查数据库端的最大链接数。

    4、将c3p0的debug日志打开,检查它的managed、unused、available的分别size


  2. deadlock  

c3p0--常见异常,布布扣,bubuko.com

时间: 2024-11-05 17:31:37

c3p0--常见异常的相关文章

2015-09-16 mysql 主从原理、 同步常见异常及恢复方法

1.原理 MySQL复制技术有以下一些特点:            (1)    数据分布 (Data distribution ) (2)    负载平衡(load balancing)             (3)    备份(Backups)           (4)    高可用性和容错行 High availability and failover 整体上来说,复制有3个步骤: (1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,

Hadoop常见异常及其解决方案

1.Shell$ExitCodeException 现象:运行hadoop job时出现如下异常: 14/07/09 14:42:50 INFO mapreduce.Job: Task Id : attempt_1404886826875_0007_m_000000_1, Status : FAILED Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException: org.apache.hadoo

开通博客第一天 (先发一些android(java)常见异常信息

常见异常: java.lang.AbstractMethodError抽象方法错误.当应用试图调用抽象方法时抛出. java.lang.AssertionError断言错.用来指示一个断言失败的情况. java.lang.ClassCircularityError类循环依赖错误.在初始化一个类时,若检测到类之间循环依赖则抛出该异常. java.lang.ClassFormatError类格式错误.当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出. ja

Spring学习总结(14)——Spring10种常见异常解决方法

在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/

开发常见异常

常见异常总结: 问题:IllegalAgumentExecption 问题:内存溢出异常 这个一般报[http-8080-3]之类的 1.在eclipse安装目录中将eclipse的启动参数调大一些: -startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1

python常见异常分类与处理方法

Python常见异常类型大概分为以下类: 1.AssertionError:当assert断言条件为假的时候抛出的异常 2.AttributeError:当访问的对象属性不存在的时候抛出的异常 3.IndexError:超出对象索引的范围时抛出的异常 4.KeyError:在字典中查找一个不存在的key抛出的异常 5.NameError:访问一个不存在的变量时抛出的异常 6.OSError:操作系统产生的异常 7.SyntaxError:语法错误时会抛出此异常 8.TypeError:类型错误,

java中10大常见异常

NO.1 java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然

Spring10种常见异常解决方法

在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/

android常见异常总结

本文重在Java中异常机制的一些概念.写本文的目的在于方便我很长时间后若是忘了这些东西可以通过这篇文章迅速回忆起来.1. 异常机制1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.1.2 传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果.这样做有如下的弊端:例如函数返回-1代表出现异常,但是

异常处理、常见异常说明

常见异常简析: ①  java.lang.ArithmeticException   算数异常.当运行时出现算术的错误(比如,除零)抛出. ②  java.lang.NullPointerException空指针异常.对null值调用属性和方法时抛出. ③  Java.long.ArrayIndexOutOfBoundsException  数组下标越界异常.当数组变量引用非法下标时抛出. ④  Java.long.NuberFormatException  数字格式化异常.当将字符串转成整形时