45

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

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

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

有任何想法吗?

4

5 回答 5

42

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

该错误显然是由于监听器不接受连接而导致的,但是为什么在其他测试可以连接正常的情况下会出现该错误(我们也可以通过sqlplus连接没有问题)?问题的关键不是无法连接,而是断断续续

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

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

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

于 2008-10-15T23:34:19.983 回答
33

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

  • 运行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-appropriate-service-handler-found-error/

于 2012-03-05T04:58:38.633 回答
4

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

然后我尝试Thread.sleep()在每个connection.close();.

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

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

于 2016-03-31T07:03:09.183 回答
2

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

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

This is much less of an issue in the real world because the DB servers are much bigger and there is a healthy mix of operations (not just endless DB connect/disconnect operations).

于 2017-05-31T18:43:12.703 回答
1

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

于 2016-12-19T15:36:54.490 回答