Tomcat连接Oracle数据库报错Connections could not be acquired from the underlying database

一、故障现象

周一上班,有用户反馈系统登录不上,据说这套系统运行2年一直没问题,突然就访问不了。因为这个系统之前一直都不是我在维护,因此不是很熟悉这个系统,但是还是答应帮忙看了一下。

服务器运行的是tomcat7,查看日志,比较明显的错误信息有下面两条:

1
Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!
1
java.sql.SQLException: The Network Adapter could not establish the connection

二、分析排查

通过前面的tomcat错误日志,可以初步判断是数据库连接出现了问题,接下来去查看数据库的情况。

经过了解,tomcat连接的是本机的oracle数据库,版本为oracle 11g,查看监听状态:

1
lsnrctl status

命令执行完,未发现异常,接下来检查Oracle数据库的网络连接配置和诊断网络连接问题

1
tnsping orcl

以上命令执行了多次发现只有一两次结果正常,而且延迟很大,超过1000ms,由此基本可以确定为数据库网络连接出现了问题。

然后继续去看listener的日志文件,发现日志文件大小居然超过2GB,费了很大劲打开了日志文件,频繁出现下面的错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Fatal NI connect error 12537, connecting to:
(LOCAL=NO)
VERSION INFORMATION:
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for 64-bit Windows: Version 11.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 64-bit Windows: Version 11.2.0.1.0 - Production
Time: 29-7月 -2024 08:25:19
Tracing not turned on.
Tns error struct:
ns main err code: 12537
TNS-12537: TNS: 连接关闭
ns secondary err code: 12560
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0

三、问题解决

参考[1]的说法,listener.log日志大小不能超过2GB(有些平台是4GB),否则会导致LISTENER监听器无法处理新的连接,问题原因终于找到了,那么接下来就是解决问题了。

3.1 首先关闭日志

1
lsnrctl set log_status off

3.2 清空日志

1
cls > listener.log

3.3 打开日志

1
lsnrctl set log_status on

3.4 重新加载监听

1
lsnrctl reload

执行完上面一系列操作,数据库连接终于恢复了正常,此时执行tnsping命令,返回几乎就是0毫秒,业务系统访问也没有问题了。

以上是针对Windows下的操作,对于Linux系统差不多类似。

四、参考

  1. Doc ID 739530.1 How to delete or refresh/recycle a SQL*Net Listener log file while the Listener is active