Tomcat连接Oracle数据库报错Connections could not be acquired from the underlying database
一、故障现象
周一上班,有用户反馈系统登录不上,据说这套系统运行2年一直没问题,突然就访问不了。因为这个系统之前一直都不是我在维护,因此不是很熟悉这个系统,但是还是答应帮忙看了一下。
服务器运行的是tomcat7,查看日志,比较明显的错误信息有下面两条:
1 |
|
1 |
|
二、分析排查
通过前面的tomcat错误日志,可以初步判断是数据库连接出现了问题,接下来去查看数据库的情况。
经过了解,tomcat连接的是本机的oracle数据库,版本为oracle 11g,查看监听状态:
1 |
|
命令执行完,未发现异常,接下来检查Oracle数据库的网络连接配置和诊断网络连接问题
1 |
|
以上命令执行了多次发现只有一两次结果正常,而且延迟很大,超过1000ms,由此基本可以确定为数据库网络连接出现了问题。
然后继续去看listener的日志文件,发现日志文件大小居然超过2GB,费了很大劲打开了日志文件,频繁出现下面的错误信息:
1 |
|
三、问题解决
参考[1]的说法,listener.log
日志大小不能超过2GB(有些平台是4GB),否则会导致LISTENER
监听器无法处理新的连接,问题原因终于找到了,那么接下来就是解决问题了。
3.1 首先关闭日志
1 |
|
3.2 清空日志
1 |
|
3.3 打开日志
1 |
|
3.4 重新加载监听
1 |
|
执行完上面一系列操作,数据库连接终于恢复了正常,此时执行tnsping
命令,返回几乎就是0毫秒,业务系统访问也没有问题了。
以上是针对Windows下的操作,对于Linux系统差不多类似。
四、参考
- Doc ID 739530.1 How to delete or refresh/recycle a SQL*Net Listener log file while the Listener is active ↩