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

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

我正在使用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+"')"); } 

我没有得到如何处理此exception。

您的multithreading应用程序打开了太多的连接/会话。 因此,监听器正在暂停并阻塞新连接一段时间。

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

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

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

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

实际上,应该始终完成连接池(#1)。 否则应用程序无法扩展。 有关详细信息,请查看Apache Commons DBCP 。 对于#2,以SYSTEM身份打开一个新的SQL * Plus会话并运行:

 ALTER system SET processes= scope=spfile; 

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

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

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

在你的最后尝试这个解决方案。 它对我有用。 关闭try / catch块中的连接,关闭连接后,写入 –

 Thread.sleep(1000); 

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

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