值java.sql.SQLException:监听拒绝与以下错误的连接:ORA-12519,TNS:

2019-09-01 04:21发布

我传递ResultSet对象到每个线程。 每个线程连接到数据库,并插入数据。 直到线程110这是工作的罚款。 它跨越111线后,它抛出上述异常。

我使用Oracle 11g。

我的样品线程的代码是:

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+"')");

       }

我没有得到如何处理这个异常。

Answer 1:

你的多线程应用程序打开太多的连接/会话。 因此,听者正在下降和阻塞了一段新的连接。

首先检查你的数据库资源使用:

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

请检查您是否为MAX_UTILIZATION无论您的流程或会话的方式是太接近了LIMIT_VALUE。 如果是的话,你应该:

  1. 使用DB连接池共享Connection线程之间的对象。 要么,
  2. 增加的过程中,甲骨文可以同时服务/会话的数量。

事实上,连接池(#1)应始终做到。 一个应用程序不能以其他方式扩大规模。 检查的Apache下议院DBCP了解详情。 #2,打开一个新的SQL * Plus会话系统并运行:

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

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



Answer 2:

我猜的数据库只是不接受来自您的主机更多的连接。 如果我理解你的问题的权利,你正在也许100个线程,每个连接在短时间内数据库。 也许你甚至不正确关闭连接,或者访问被持续这么长时间,一个巨大的连接的数量被打开。 该数据库有其接受连接的限制。

你一定要通过一些巧妙的手法减少连接的数量。 也许减少并发线程的数量和/或使用连接池。



Answer 3:

试着在你结束这个解决方案。 它为我工作。 关闭在try / catch块,只是关闭连接,直写后的连接

Thread.sleep(1000);

在这种情况下,你可以把它写原样

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


文章来源: java.sql.SQLException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found
标签: java oracle jdbc