Oracle 问题记录

一:

--- Check the SQL Statement (preparation failed). --- Cause: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

无法获取连接,连接池等待空闲对象超时错误

1:没有很好的关闭使用后的连接会出现此情况

2:应用压力过大,确实无法获取空闲连接(数据库所在服务器还部署一些其他服务,或者进行大量的CPU占用导致服务器和数据库均反应缓慢)【可能造成CPU使用率高的情况有:大量排序、大量SQL解析、全表扫描】

二:

Cause: java.sql.SQLException: Closed Connection ; uncategorized SQLException for SQL []; SQL state [99999]; error code [17008]; Closed Connection; nested exception is java.sql.SQLException: Closed Connection

DB进行了重启,导致项目连接池被数据库关闭。应用通过连接池获得连接时,获取到这些不可用的连接,且这些连接如果不被其他线程回收的话;它们不会被连接池废除,也不会重新被创建,占用了连接池的名额,就会报上面的错误

1:项目进行重启,会重新创建连接池

2:更改数据库配置:目前数据库配置没有进行检查配置

org.apache.tomcat.jdbc.pool.DataSource pool

tomcat:
  datasource:
    driverClassName: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:host
    username: username
    password: password
    maxActive: 100  连接池当中最大的数据库连接 ,请求超出此数时,加入等待队列中
    maxIdle: 8    最大空闲连接
    minIdle: 8   最小空闲连接
    initialSize: 10  初始化连接数:连接池启动时创建的初始化连接数量,默认值0 
    testOnBorrow: false  申请连接检测
    testOnReturn: false   归还连接检测

initialSize

这里的初始指的是第一次getConnection的时候, 创建数据库连接是很耗时的,所以初始化连接并不是越多越好 配置过大容易导致服务发布首次请求出现大量超时

testOnBorrow

不建议设置testOnBorrowtrue。否则每次从连接池中取出连接时,都需要执行validationQuery = "SELECT 1" 中的SQL进行测试,对服务性能有非常大的影响

 testOnReturn

和testOnBorrow一样,也不建议开启

当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用。当连接使用完,调用commit或者rollback方法后,连接池会回收该连接

增加如下配置:

validationQuery = "SELECT 1"  验证使用的SQL语句
testWhileIdle = "true"     
timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器
minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收

testWhileIdle

如果testOnBorrow没有设置true,则建议testWhileIdle设置为true。指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除。这个检查时间通过timeBetweenEvictionRunsMillis来控制

检验方法:配置使用validationQuery = "SELECT 1" 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。

三:

1:锁表查询

select count(*) from v$locked_object;
select * from v$locked_object;

2.查看哪个表被锁

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

3查看是哪个session引起的

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值