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

时间:2013-04-26 06:56:16

标签: java oracle jdbc

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

       }

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

3 个答案:

答案 0 :(得分:17)

您的多线程应用程序打开了太多的连接/会话。因此,监听器暂时停止并阻止新连接。

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

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

检查您的进程或会话的MAX_UTILIZATION是否过于接近LIMIT_VALUE。如果是,您应该:

  1. 使用数据库连接池在线程之间共享Connection个对象。或者,
  2. 增加Oracle可以同时处理的进程/会话数。
  3. 实际上,应始终完成连接池(#1)。否则应用程序无法扩展。有关详细信息,请查看Apache Commons DBCP。对于#2,以SYSTEM身份打开一个新的SQL * Plus会话并运行:

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

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

答案 1 :(得分:1)

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

你应该通过一些聪明的技术减少连接数量。也许减少并发线程数和/或使用连接池。

答案 2 :(得分:-1)

在您的最后尝试此解决方案。它对我有用。 在关闭连接后关闭try / catch块中的连接, 写 -

Thread.sleep(1000);

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

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