java.sql.SQLException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found

前端 未结 3 2147
栀梦
栀梦 2021-02-10 17:08

I am passing Resultset object to each thread. Each thread is connecting to the database and inserting data. Untill thread 110 it is working fine. After it crosses 111 thread it

相关标签:
3条回答
  • 2021-02-10 17:35

    Your multi-threaded application is opening too many Connections/Sessions. Hence, the listener is dropping and blocking new connections for a while.

    Check your DB resource usage first:

    SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
    

    Check to see if your MAX_UTILIZATION for either your Processes or Sessions is getting too close to the LIMIT_VALUE. If yes, you should either:

    1. Use DB Connection pooling to share Connection objects between threads. Or,
    2. Increase the number of processes/sessions that Oracle can service simultaneously.

    Actually, Connection Pooling (#1) should always be done. An application cannot scale up otherwise. Check Apache Commons DBCP for details. For #2, open a new SQL*Plus session as SYSTEM and run:

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

    to increase backend concurrency. Then RESTART the Database. IMPORTANT!

    0 讨论(0)
  • 2021-02-10 17:51

    I guess the database just don't accept more connections from your host. If I understand your question right you are making maybe 100 threads which each connects to the database in short time. Maybe you don't even close the connection correctly, or the accesses are lasting so long that a huge amount of connections are opened. The database have a limit to which it accepts connections.

    You should definitely reduce the number of connections by some clever technique. Maybe reduce the number of concurrent threads and/or use a connection pool.

    0 讨论(0)
  • 2021-02-10 17:51

    Try this solution at your end. It worked for me. Close the connection in try/catch block and just after closing the connection, write-

    Thread.sleep(1000);
    

    In this case you can write it as-

    finally {
                try {
                    if (conn != null && !conn.isClosed())
                        {
                        conn.close();
                        Thread.sleep(1000);
                         }
                    }
                catch (SQLException e) {
                    e.printStackTrace();}
    }
    
    0 讨论(0)
提交回复
热议问题