如何解决Java应用在高并发下出现的Oracle监听器连接被拒?

轻婷酱_1786

轻婷酱_1786

2026-07-15

946人浏览

原创

ORA-12519错误主因是Oracle数据库进程数达上限,需先查v$process当前连接数与v$parameter中processes参数值,若接近或超限,即为连接池耗尽;同时须核对JDBC URL的service_name/SID是否与lsnrctl status及v$parameter中service_names严格一致,并排查监听日志过大导致的假死等问题。

ORA-12519 是连接数打满,不是网络不通

java应用一上高峰就报 listener refused the connection,十有八九是 ora-12519 —— 监听器明确拒绝新连接,原因不是防火墙或ip写错,而是数据库进程池已耗尽。此时客户端连不上,但 sqlplus / as sysdba 仍能登录,说明实例活着,只是“没位置了”。

  • 立刻查真实连接数:select count(*) from v$process;
  • 再查上限:select value from v$parameter where name = 'processes';
  • 如果前者 ≥ 后者 × 0.9,基本锁定为连接泄漏或配置过小
  • 常见泄漏点:没用 try-with-resources、Connection.close() 被跳过、Spring事务未正确传播导致连接未归还池

JDBC URL 写错 service_name 或 SID 就直接被拒

ORA-12505(SID 不存在)和 ORA-12514(service_name 不注册)看起来像连接失败,实则是监听器根本“不认识你找的那个库”。JDBC URL 中冒号 : 和斜杠 / 的用法不能混,且必须与数据库实际注册名严格一致。

  • jdbc:oracle:thin:@host:port:XE → 按 SID 连(适用于 Oracle XE 等老实例)
  • jdbc:oracle:thin:@host:port/XE → 按 service_name 连(现代推荐方式)
  • 查真实 service_name:SELECT value FROM v$parameter WHERE name = 'service_names';
  • 查监听注册了哪些服务:lsnrctl status,看输出里 Service "xxx" has 1 instance(s) 那行
  • 注意:XE 实例的 SID 是 XE,但 service_name 可能是 XEXDB 或 XE,版本间不统一

listener.log 超 4GB 会导致 lsnrctl 假死

现象是客户端报 ORA-12541: No listener,但 Windows 服务管理器显示监听服务“正在运行”,lsnrctl status 卡在 Connecting to... —— 这是 Windows 上经典 bug:监听日志文件超过约 4GB 后,tnslsnr.exe 会静默挂起,不再响应任何命令。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
  • 定位日志路径:%ORACLE_BASE%\diag\tnslsnr\%COMPUTERNAME%\listener\trace\listener.log
  • 不要直接删,先重命名备份,例如:listener.log.old.20260624
  • 执行 lsnrctl stop(若卡住,用任务管理器结束 tnslsnr.exe 进程)
  • 重启监听:lsnrctl start,然后立即执行 lsnrctl status 确认实例是否注册
  • 若实例未注册,需手动触发动态注册:alter system register;(在 SQL*Plus 中执行)

连接池配置不当会让问题雪上加霜

很多 Java 应用用 HikariCP 或 DBCP,但 maxPoolSize 设得比 Oracle 的 processes 还大,或者没设 connection-timeout,结果线程等不到连接,不断重试,反而加剧监听器压力。

  • HikariCP 关键参数示例:maximumPoolSize=30、connectionTimeout=30000、leakDetectionThreshold=60000
  • Oracle 默认 processes=150(XE 版仅 40),Java 应用池大小建议 ≤ 70% 上限,留余量给 DBA 工具和后台作业
  • 务必开启连接泄漏检测,否则 Connection 被持有不放,v$process 会持续增长直到打满
  • 避免每个线程都 new Connection:多线程批量插入时,应复用连接 + 批处理(addBatch()),而非开 100+ 独立连接

真正麻烦的不是单个错误码,而是多个因素叠加:比如日志撑爆导致监听假死,同时 JDBC URL 写错 service_name,再配上连接池无 timeout,三者一起发作时排查顺序错了就会白忙两小时。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10277

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7402

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6492

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1124

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1356

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2709

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20011

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习