oracle间歇性,Oracle间歇性地抛出“ ORA-12516,TNS:侦听器找不到具有匹配协议栈的可用处理程序”...

在测试Oracle XE连接建立机制时,我遇到了以下问题。

尽管每次迭代都会关闭连接,但是在50-100次连接之后,Oracle开始间歇性地引发以下异常:

java.sql.SQLException: Listener refused the connection with the following error:

ORA-12516, TNS:listener could not find available handler with matching protocol stack

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:254) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:207) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:157) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at com.vladmihalcea.book.high_performance_java_persistence.jdbc.connection.OracleConnectionCallTest.test(OracleConnectionCallTest.java:57) [test-classes/:na]

The test can be found on GitHub:

for (int i = 0; i < callCount; i++) {

try {

long startNanos = System.nanoTime();

try (Connection connection = dataSource.getConnection()) {

}

timer.update(System.nanoTime() - startNanos, TimeUnit.NANOSECONDS);

sleep(waitMillis);

} catch (SQLException e) {

LOGGER.info("Exception on iteration " + i, e);

}

}

如果我尝试使用35毫秒的等待步骤打开/关闭连接,则一切正常。如果我将等待时间降低到10 ms,则异常会开始从tim到time抛出。

报告TNS-12516和/或TNS-12519错误的最常见原因之一是达到配置的最大过程和/或会话限制数。发生这种情况时,TNS侦听器的服务处理程序将变为“已阻止”,并且无法建立新连接。一旦TNS侦听器从与数据库实例相关联的PMON进程收到更新,告诉TNS侦听器,阈值低于配置的限制,并且数据库现在接受连接恢复连接。

PMON负责使用有关特定实例的信息(例如负载和调度程序信息)更新侦听器。专用连接的最大负载由PROCESSES参数确定。 PMON提供SERVICE_UPDATE信息的频率根据实例的工作负载而变化。这些服务更新之间的最大间隔为10分钟。

侦听器计算它与实例建立的连接数,但不会立即获得有关已终止连接的信息。仅当PMON通过SERVICE_UPDATE更新侦听器时,侦听器才被告知当前负载。由于这可能需要长达10分钟的时间,因此根据侦听器的当前实例负载与实际实例负载之间可能会有差异。

当侦听器认为当前连接数已达到最大负载时,它可以将实例的服务处理程序的状态设置为“已阻止”,并开始拒绝出现以下错误之一的传入客户端连接:ora-12519或ora-1251 ”

我想知道这是某种错误还是Oracle的设计工作原理。

更新资料

在Oracle 11g企业版上,它可以正常工作,因此是XE的限制。

固定

Using connection pooling is probably the best way of fixing this issue, which also reduces the connection acquisition time and levels-up traffic spikes.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值