一:
--- 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
不建议设置
testOnBorrow
为true。
否则每次从连接池中取出连接时,都需要执行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;