java.sql.SQLException : Listener refused the connection with the following error: ORA-12519, TNS:找不到合适的服务处理程序

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

       }

我不知道如何处理这个异常。

最佳答案

您的多线程应用程序打开了过多的连接/ session 。因此,监听器会在一段时间内丢弃并阻止新连接。

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

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

检查您的进程或 session 的 MAX_UTILIZATION 是否太接近 LIMIT_VALUE。如果是,您应该:

  1. 使用数据库连接池在线程之间共享Connection 对象。或者,
  2. 增加 Oracle 可以同时服务的进程/ session 的数量。

实际上,连接池 (#1) 应该始终完成。否则应用程序无法扩展。检查Apache Commons DBCP了解详情。对于 #2,以 SYSTEM 身份打开一个新的 SQL*Plus session 并运行:

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

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

关于java.sql.SQLException : Listener refused the connection with the following error: ORA-12519, TNS:找不到合适的服务处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16230446/

相关文章:

oracle - 从 PLSQL 中的表派生函数

arrays - 如何在 PL/SQL 中手动初始化 RECORD 集合?

sql - 许多天之间的人类可读的耗时

postgresql - jOOQ 时间戳与本地时区偏移一起存储

JAVA写入Access数据库并检索和索引

java - 如何连接不同类中的多个ArrayList。 (java银行程序)

java - PDF 框。使用相同图像生成多页文档

java - JDBC(mysql)在堆内存中保存查询

Java MySQL 执行更新 SQLSyntaxErrorException

java - 提取 : and WORD in java using regex in java 之间的子字符串