我们正在 Oracle 10 数据库前针对 Weblogic 9 运行 Junit 4 测试套件(使用 Hudson 作为持续集成服务器),有时我们会在脚本拆卸过程中遇到 ORA-12519 崩溃。但是,该错误非常间歇性:

  • 它通常发生在同一个测试类中
  • 对于相同的测试用例并不总是发生(有时它们会通过)
  • 对于相同数量的测试用例(3-9 个),这种情况不会发生
  • 有时候根本就没有发生,一切都会过去

虽然我不能保证这种情况不会在本地发生(当然,当针对同一数据库运行时),但我已经多次运行相同的类套件,没有任何问题。

有任何想法吗?

有帮助吗?

解决方案

不知道这是否是每个人的答案,但经过一番挖掘后,这就是我们得出的答案。

该错误显然是由于侦听器不接受连接而引起的,但是为什么当其他测试可以正常连接时我们会收到该错误(我们也可以通过 sqlplus 连接没有问题)?问题的关键不在于我们无法连接,而在于它 间歇性的

经过一番调查,我们发现在类设置期间创建了一些静态数据,这些数据将在测试类的生命周期中保持开放连接,并在运行过程中创建新的连接。现在,即使当此类超出范围时(当然是通过 finally{} 块),所有资源都已正确释放,但在运行过程中,在某些情况下此类会吞噬所有可用连接(好吧,不好)练习警报 - 这是直接连接而不是使用池的单元测试代码,因此在生产中不会发生相同的问题)。

修复方法是不将该类设为静态并在类设置中运行,而是在每个方法的 setUp 和tearDown 方法中使用它。

因此,如果您在自己的应用程序中遇到此错误,请对那个坏男孩使用分析器,看看是否可能存在连接泄漏。希望有帮助。

其他提示

我发现的另一个类似错误但相同错误消息的解决方案是增加找到的服务处理程序的数量。(我的此错误实例是由 Weblogic Portal 连接池中的连接过多引起的。)

  • 跑步 SQL*Plus 并登录为 SYSTEM. 。您应该知道在安装 Oracle DB XE 期间使用的密码。
  • 运行命令 alter system set processes=150 scope=spfile; 在 SQL*Plus 中
  • 很重要:重新启动数据库。

从这里:

http://www.atpeaz.com/index.php/2010/fixing-the-ora-12519-tnsno-property-service-handler-found-error/

我也遇到了同样的问题,查了很多地方的答案。我得到了许多类似的答案来更改进程/服务处理程序的数量。但我想,如果我忘记将其重置回来怎么办?

然后我尝试使用 Thread.sleep() 我的每个之后的方法 connection.close();.

我不知道如何,但它至少对我有用。

如果有人想尝试一下并弄清楚它是如何工作的,请继续。我也想知道它,因为我是编程世界的初学者。

我有类似的问题。每当我运行一组数据库(Spring JDBC)测试时,都会发生这种情况 SpringJUnit4ClassRunner, ,所以我解决了这个问题 @DirtiesContext 每个测试的注释,以便清理应用程序上下文并释放所有资源,因此每个测试都可以使用应用程序上下文的新初始化来运行。

我在单元测试中遇到了这个问题,该测试通过连接池打开了许多与数据库的连接,然后“停止”连接池(实际上是 ManagedDataSource)以在每次测试结束时释放连接。我总是在测试套件的某个时刻耗尽连接。

在我的测试的teardown()中添加了Thread.sleep(500),这解决了问题。我认为发生的情况是连接池 stop() 释放了另一个线程中的活动连接,因此,如果主线程继续运行测试,则清理线程会远远落后,导致 Oracle 服务器耗尽连接。添加睡眠允许后台线程释放池连接。

在现实世界中,这并不是什么问题,因为数据库服务器更大,并且存在健康的操作组合(不仅仅是无休止的数据库连接/断开操作)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top