ORA-12519, TNS:no appropriate service handler found

利用java连接数据库进行大量数据的读写时(每次读写时都重新连接数据库--相当于有多个客户端同时要连接数据库),有时候正常,有时候会出现如下异常:

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
192.168.95.86:1521:orcl


at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)GpsDaoProxy.doCreate()

原因:可能是数据库上当前的连接数目已经超过了它能够处理的最大值.

(1)select count(*) from v$process   --查看数据库当前的连接数


(2)select value from v$parameter where name = 'processes'   --数据库允许的最大连接数


<think>好的,我现在需要帮助用户解决Oracle数据库的ORA-12519错误。首先,我需要回忆一下这个错误的常见原因和解决方法。根据之前提供的引用内容,这个错误通常与数据库进程数达到上限有关,比如最大进程数(processes)或会话数(sessions)被超过。用户提到引用[3]中显示错误是ORA-00020,指出最大进程数150被超过,所以这可能是一个关键点。 接下来,我应该分步骤思考如何解决这个问题。首先,确认当前数据库的进程和会话使用情况。用户可能需要登录到数据库服务器,使用sysdba账户通过SQL*Plus执行查询,比如查看当前进程数和会话数,以及设置的最大值。例如,查询v$resource_limit视图,或者使用show parameter processes和show parameter sessions命令。 然后,调整数据库参数。如果当前进程数已经达到最大值,就需要增加processes和sessions参数的值。这需要修改spfile或者pfile,然后重启数据库实例。但用户可能遇到生产环境不能立即重启的情况,这时候可能需要寻找临时解决方案,比如释放一些资源或杀掉无效会话。不过,根据引用[3],用户已经尝试用sqlplus连接,但遇到了ORA-00020,说明此时数据库已经无法处理新连接,可能需要通过操作系统级别的强制终止进程,或者等待部分会话释放。 另外,还需要检查监听器的服务处理程序是否足够。有时候,监听器的配置问题也可能导致ORA-12519,比如监听器无法分配更多的服务处理器。这时候可能需要调整监听器的配置,比如增加LISTENER的QUEUESIZE参数,或者检查是否有足够的资源分配给监听器。 此外,用户可能没有正确配置数据库服务,或者监听器没有正确注册服务。需要检查监听器状态(lsnrctl status),确认数据库服务是否已经动态注册。如果动态注册有问题,可能需要手动注册,或者检查数据库的local_listener参数是否正确。 然后,用户可能需要检查数据库的连接泄漏问题,比如应用程序没有正确关闭连接,导致大量空闲会话堆积。这时候需要分析应用的连接管理,或者设置sqlnet.expire_time来终止不活动的连接。 最后,总结解决方案的步骤,并给出相关的注意事项,比如调整参数时的计算方式(sessions通常是1.1*processes +5),以及在生产环境中谨慎操作,避免服务中断。 现在,我需要将这些步骤整理成一个清晰的解决方案,确保用户能够逐步操作。同时,要引用提供的参考资料,特别是引用[3]中提到的进程数超出问题,以及可能的解决方法。还要注意使用中文,结构清晰,分点说明,并生成相关问题。</think>### ORA-12519错误解决方案分步说明 #### 1. **确认当前数据库资源限制** 通过SQL*Plus连接到数据库(需操作系统权限): ```sql -- 查询当前进程和会话使用情况 SELECT * FROM v$resource_limit WHERE resource_name IN ('processes', 'sessions'); -- 查看最大进程数设置 SHOW PARAMETER processes; SHOW PARAMETER sessions; ``` 若`CURRENT_UTILIZATION`接近`LIMIT_VALUE`,则需调整参数[^3]。 #### 2. **调整数据库参数** 修改`processes`和`sessions`参数(需重启数据库): ```sql -- 临时修改(立即生效,但重启失效) ALTER SYSTEM SET processes=300 SCOPE=spfile; ALTER SYSTEM SET sessions=335 SCOPE=spfile; -- 通常sessions = 1.1*processes +5 -- 重启数据库 SHUTDOWN IMMEDIATE; STARTUP; ``` 注:若无法立即重启,需先释放资源(见步骤3)。 #### 3. **释放现有资源** 强制终止无效会话(谨慎操作): ```sql -- 查询非活跃会话 SELECT sid, serial#, username, status FROM v$session WHERE type='USER' AND status='INACTIVE'; -- 终止指定会话 ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` #### 4. **检查监听器配置** 查看监听器状态并调整配置: ```bash # 在操作系统执行 lsnrctl status # 若发现"Service handler not found",尝试重启监听器 lsnrctl stop lsnrctl start ``` 修改`listener.ora`添加队列大小: ```ini LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (QUEUESIZE = 1000) -- 增加队列容量 ) ``` #### 5. **验证动态服务注册** 确保数据库向监听器动态注册: ```sql SHOW PARAMETER service_names; SHOW PARAMETER local_listener; -- 手动注册(若自动注册失败) ALTER SYSTEM REGISTER; ``` #### 6. **预防连接泄漏** - 在`sqlnet.ora`中设置空闲超时: ```ini SQLNET.EXPIRE_TIME = 10 -- 每10分钟检测空闲连接 ``` - 优化应用程序连接池配置,确保及时释放连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值