代码之家  ›  专栏  ›  技术社区  ›  Paul de Vrieze

导致间歇性ORA-12519(TNS:未找到适当的处理程序)错误的原因

  •  39
  • Paul de Vrieze  · 技术社区  · 17 年前

    我们在Oracle10数据库(使用Hudson作为持续集成服务器)前面运行针对WebLogic9的JUnit4测试套件,偶尔在脚本拆卸期间会发生ORA-12519崩溃。但是,错误是非常间歇性的:

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

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

    有什么想法吗?

    5 回复  |  直到 8 年前
        1
  •  38
  •   Paul de Vrieze    17 年前

    不知道这是否会是每个人的答案,但经过一些挖掘,我们得出了以下结论。

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

    经过一些调查,我们发现在类设置期间创建了一些静态数据,这些静态数据将在测试类的生命周期中保持开放的连接,并在运行过程中创建新的连接。现在,即使当这个类超出作用域时(当然是通过一个finally块),所有的资源都被正确地释放了,在运行期间,有一些情况下,这个类会吞没所有可用的连接(好的,坏的实践警报-这是直接连接的单元测试代码,而不是使用池,所以同样的问题无法在生产中发生)。

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

    所以,如果你在自己的应用程序中发现了这个错误,就给那个坏小子一个剖析器,看看你是否有连接泄漏。希望有帮助。

        2
  •  26
  •   edwardsmatt    13 年前

    我发现的另一个类似错误的解决方案是增加找到的服务处理程序的数量。(我的此错误实例是由于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/

        3
  •  3
  •   Mogsdad    9 年前

    我也有同样的问题,我在很多地方寻找答案。我得到了许多类似的答案来更改流程/服务处理程序的数量。但我想,如果我忘了把它复位怎么办?

    然后我试着用 Thread.sleep() 方法 connection.close(); .

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

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

        4
  •  1
  •   Shendor    9 年前

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

        5
  •  1
  •   Andrew McGregor    8 年前

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

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

    在现实世界中,这一问题要少得多,因为DB服务器要大得多,而且操作混合良好(不仅仅是无休止的DB连接/断开连接操作)。

    推荐文章