java.sql.SQLException:侦听器拒绝连接,出现以下错误:ORA-12519,TNS:未找到适当的服务处理程序

java.sql.SQLException:侦听器拒绝连接,出现以下错误:ORA-12519,TNS:未找到适当的服务处理程序,java,oracle,jdbc,Java,Oracle,Jdbc,我正在将Resultset对象传递给每个线程。每个线程都连接到数据库并插入数据。直到线程110它是工作正常。在它穿过111个线程之后,它抛出上面的异常 我正在使用Oracle11g 我的示例线程代码是: class MyThreadClass implements Runnable { public Connection connection; public Statement statement2; public ResultSet rs2;

我正在将Resultset对象传递给每个线程。每个线程都连接到数据库并插入数据。直到线程110它是工作正常。在它穿过111个线程之后,它抛出上面的异常

我正在使用Oracle11g

我的示例线程代码是:

class MyThreadClass implements Runnable 

{

    public Connection connection;

    public Statement statement2;

    public ResultSet rs2;    

    public String cookie;


    public MyThreadClass(ResultSet rs1)  
    {
      rs2=rs1;
    }

    public void run() 
    {    
       try
       {                    
            cookie=rs2.getString("COOKIE");
            driver = "oracle.jdbc.driver.OracleDriver";
            url    = "jdbc:oracle:thin:@127.0.0.1:1521:xx";
            /* connection

                statement2.executeUpdate("INSERT INTO visit_header  VALUES ('"+cookie+"')");

       }

我不知道如何处理此异常。

我猜数据库不接受来自主机的更多连接。如果我没有弄错你的问题,你可能正在制作100个线程,每个线程在短时间内连接到数据库。可能您甚至没有正确关闭连接,或者访问持续时间太长,以至于打开了大量连接。数据库接受连接的限制是有限的


你应该通过一些巧妙的技巧来减少连接的数量。可能减少并发线程的数量和/或使用连接池。

您的多线程应用程序打开的连接/会话太多。因此,侦听器会在一段时间内删除并阻止新连接

首先检查您的数据库资源使用情况:

SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
检查进程或会话的最大利用率是否太接近极限值。如果是,您应该:

  • 使用DB连接池在线程之间共享
    连接
    对象。或者
  • 增加Oracle可以同时服务的进程/会话的数量
  • 事实上,连接池(#1)应该始终完成。否则,应用程序无法扩展。查看详细信息。对于#2,打开一个新的SQL*Plus会话作为系统并运行:

    ALTER system SET processes=<n-as-per-number-of-threads> scope=spfile;
    
    ALTER system SET processs=scope=spfile;
    

    以增加后端并发性。然后重新启动数据库。重要

    在你这边试试这个解决方案。这对我有用。 在try/catch块中关闭连接,并在关闭连接之后, 写-

    在这种情况下,您可以将其写成-

    finally {
                try {
                    if (conn != null && !conn.isClosed())
                        {
                        conn.close();
                        Thread.sleep(1000);
                         }
                    }
                catch (SQLException e) {
                    e.printStackTrace();}
    }
    

    我正在使用Hikari CP,这发生在我身上。我重新启动了服务(应用程序),一切都恢复正常。当然,这取决于每个具体情况。在我的情况下,这是自动诱惑服务。现在我将进一步调查所发生的事情。
    finally {
                try {
                    if (conn != null && !conn.isClosed())
                        {
                        conn.close();
                        Thread.sleep(1000);
                         }
                    }
                catch (SQLException e) {
                    e.printStackTrace();}
    }