什么可能导致间歇性ORA-12519(TNS:找不到合适的处理程序)错误

时间:2008-10-15 15:25:49

标签: oracle junit oracle10g ora-12519

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

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

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

有什么想法吗?

5 个答案:

答案 0 :(得分:38)

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

错误显然是由于侦听器不接受连接这一事实,但是当其他测试可以正常连接时,为什么我们会得到该错误(我们也可以通过sqlplus连接没问题)?问题的关键不是我们无法连接,而是断断续续

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

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

因此,如果您在自己的应用中遇到此错误,请在该坏男孩上拍一个探查器,看看您是否有连接泄漏。希望有所帮助。

答案 1 :(得分:26)

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

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

从这里开始:

  

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

答案 2 :(得分:3)

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

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

我不知道怎么做,但它至少对我有用。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

这在现实世界中的问题要少得多,因为数据库服务器要大得多,并且运行状况良好(不仅仅是无限的数据库连接/断开操作)。