oracle报错:java.sql.SQLException: An attempt by a client to checkout a Connection has timed out

时间:2022-12-09 22:59:19



服务器在跑压力测试,测试的并发大约是3200,(每次数据上传需要两次数据库操作,更新1条记录,批处理插入10条记录,可认为并发为更新3200,插入32000),每10s执行一次,大约跑了两天(周五19点左右到周末凌晨46分出现问题)


数据库连接出现异常:


java.sql.SQLException: An attempt by a client to checkout a Connection has timed out


查看应用服务器情况(出现异常时),内存占用约为3.5G,CPU使用不足10%,而在12小时前,服务器使用情况为:







服务器用于处理业务数据的线程数为3000,


数据库操作采用JDBC,数据库连接池为C3P0,数据库为oracle



C3P0配置如下:



INITIALPOOLSIZE = 30
#连接池中保留的最大连接数。Default: 15 maxPoolSize
MAXPOOLSIZE = 300
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 acquireIncrement
ACQUIREINCREMENT = 10
#每60秒检查所有连接池中的空闲连接。Default: 0
IDLECONNECTIONTESTPERIOD = 60
#连接关闭时默认将所有未提交的操作回滚。Default: false
AUTOCOMMITONCLOSE = true
#定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度
PREFERREDTESTQUERY = select 1 from dual
#因性能消耗大请只在需要的时候使用它。
#如果设为true那么在每个connection提交的时候都将校验其有效性。
#Default fault
TESTCONNECTIONONCHECKOUT = false
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
TESTCONNECTIONONCHECKIN = false
#定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
ACQUIRERETRYATTEMPTS = 30
#两次连接中间隔时间,单位毫秒
ACQUIRERETRYDELAY = 1000
#获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
#保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
#获取连接失败后该数据源将申明已断开并永久关闭。Default: false
BREAKAFTERACQUIREFAILURE = true
#最大空闲时间,25000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
MAXIDLETIME = 25000
#c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
#通过多线程实现多个操作同时被执行。Default: 3
NUMHELPERTHREADS = 6
MAXSTATEMENTS = 0
MAXSTATEMENTSPERCONNECTION = 0
CHECKOUTTIMEOUT = 60000

查看oracle数据库情况,发现300个连接数已全部用光,且连接池中的连接没有被释放掉



由于之前对数据库这一块做过一定优化,oracle使用情况如下:





可以发现连接池连接数已用光,但奇怪的是为何我已stop了系统程序,为何连接数过了一个小时了还没有降下来,不知为何




不过此时可发现已使用的online tablespaces占了95%,怀疑是由此引起的(发生故障前4小时,已使用89%,估测在12点左右时间表空间会用光,不过由于表空间设置了自动增长,故没去注意),由于操作数据库处出现了故障,导致我所有数据在0:46停止处理(数据主要是入库操作)






由于在应用程序停止后超过一个小时,oracle连接仍然没有主动释放,故怀疑可能是oracle数据造成的而非应用程序出了故障,原因仍在分析中。。。。


解决方案:


​http://jzhil2004.blog.163.com/blog/static/2755850420101183035104/​​ )有人如此建议:




1、以dba身份登录

sqlplus username/password as sysdba

2、show parameter resource




 

3、alter system set resource_limit=true;

4、 create profile [profile文件名] limit connect_time unlimited idle_time unlimited;   

如:create profile test_profile limit connect_time unlimited idle_time unlimited;

5、  alter   user   [user_name]   profile  [profile文件名];

如:alter user comm profile test_profile;


此种方法还未试过,先记下来,周一尝试


-------------------------------------------------


周一经过测试,发现不是此处的问题,严重怀疑为表的联机空间将满导致,由于其他工作,此处未在处理,

在该库中重新建立了一个新的表空间以及用户,重新测试没有该问题出现。