JAVA web项目JDBC连接池配置过大,或者JAVA数据源JDBC连接类编写不规范,打开链接不及时关闭,会导致数据库进程数超过最大值而拒绝新连接。最近,一客户的遇到的问题就是典型的JDBC连接类打开会话不关闭导致应用链接报错:ORA-00020&ORA12516。

一、问题描述

JAVA WEB应用前台报错数据库连接超时,web中间件后台报错ORA-12516,报错信息如下:

5f0e3ef665d337e75428fbb9867091ae.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

观察Oracle数据库告警日志,会发现ORA-0020报错:

e4524ee8486717fb6f972f17909f8fa9.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

有趣的是:因为数据库是新安装部署的,开发同事并不认为这是应用导致的。作为运维的人,只能自己写个JAVA JDBC类,

重启数据库,通过自己的JAVA JDBC类操作数据库,一切如常。

JDBC JAVA类:

package com.cn;

import java.sql.*;

public class JDBCTest {

// dbUrl数据库连接串信息,其中“1521”为端口,“ora9”为sid

String dbUrl = "jdbc:oracle:thin://@117.113.168.198:1521/DB";

// theUser为数据库用户名

String theUser = "assure";

// thePw为数据库密码

String thePw = "assure";

// 几个数据库变量

Connection c = null;

Statement conn;

ResultSet rs = null;

// 初始化连接

public JDBCTest() {

try {

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

// 与url指定的数据源建立连接

c = DriverManager.getConnection(dbUrl, theUser, thePw);

// 采用Statement进行查询

conn = c.createStatement();

} catch (Exception e) {

e.printStackTrace();

}

}

// 执行查询

public ResultSet executeQuery(String sql) {

rs = null;

try {

rs = conn.executeQuery(sql);

} catch (SQLException e) {

e.printStackTrace();

}

return rs;

}

public void close() {

try {

conn.close();

c.close();

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

System.out.println("Test is true!");

ResultSet newrs;

JDBCTest newjdbc = new JDBCTest();

System.out.println(newjdbc);

newrs = newjdbc.executeQuery("select * from dba_users");

try {

while (newrs.next()) {

System.out.print(newrs.getString("USER_ID"));

System.out.print("\t" + newrs.getString("USERNAME"));

System.out.println("\t"+newrs.getString("DEFAULT_TABLESPACE"));

}

} catch (Exception e) {

e.printStackTrace();

}

newjdbc.close();

}

}

操作结果如下:

fa8c50f66344ce9422e858b042ecaaaf.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在后续的问题追踪中,也发现WEB应用一启动就占用数据库470个会话连接:

cd45df3eb27ade2459af72fc27d39cad.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

为了说明非数据库配置问题将数据库进程数调整到3000,会话连接数调整到4500:

3b570ad4e72e1bef14a2fbe6d5829928.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

8c1da959fffd7c0b0c03ba89e7cb9d68.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

但是,应用程序启动后,还是会报数据库连接异常,到这里问题基本确定,导致应用链接数据库异常的原因是超过数据库

最大进程数,数据库不能无限制的提供资源,最佳的解决方法是应用程序自身从根本上杜绝。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐