java.sql.SQLException:侦听器拒绝连接,出现以下错误:ORA-12519,TNS:未找到适当的服务处理程序
我正在将Resultset对象传递给每个线程。每个线程都连接到数据库并插入数据。直到线程110它是工作正常。在它穿过111个线程之后,它抛出上面的异常 我正在使用Oracle11g 我的示例线程代码是:java.sql.SQLException:侦听器拒绝连接,出现以下错误:ORA-12519,TNS:未找到适当的服务处理程序,java,oracle,jdbc,Java,Oracle,Jdbc,我正在将Resultset对象传递给每个线程。每个线程都连接到数据库并插入数据。直到线程110它是工作正常。在它穿过111个线程之后,它抛出上面的异常 我正在使用Oracle11g 我的示例线程代码是: class MyThreadClass implements Runnable { public Connection connection; public Statement statement2; public ResultSet rs2;
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+"')");
}
我不知道如何处理此异常。我猜数据库不接受来自主机的更多连接。如果我没有弄错你的问题,你可能正在制作100个线程,每个线程在短时间内连接到数据库。可能您甚至没有正确关闭连接,或者访问持续时间太长,以至于打开了大量连接。数据库接受连接的限制是有限的
你应该通过一些巧妙的技巧来减少连接的数量。可能减少并发线程的数量和/或使用连接池。您的多线程应用程序打开的连接/会话太多。因此,侦听器会在一段时间内删除并阻止新连接 首先检查您的数据库资源使用情况:
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
检查进程或会话的最大利用率是否太接近极限值。如果是,您应该:
连接
对象。或者ALTER system SET processes=<n-as-per-number-of-threads> scope=spfile;
ALTER system SET processs=scope=spfile;
以增加后端并发性。然后重新启动数据库。重要 在你这边试试这个解决方案。这对我有用。 在try/catch块中关闭连接,并在关闭连接之后, 写- 在这种情况下,您可以将其写成-
finally {
try {
if (conn != null && !conn.isClosed())
{
conn.close();
Thread.sleep(1000);
}
}
catch (SQLException e) {
e.printStackTrace();}
}
我正在使用Hikari CP,这发生在我身上。我重新启动了服务(应用程序),一切都恢复正常。当然,这取决于每个具体情况。在我的情况下,这是自动诱惑服务。现在我将进一步调查所发生的事情。
finally {
try {
if (conn != null && !conn.isClosed())
{
conn.close();
Thread.sleep(1000);
}
}
catch (SQLException e) {
e.printStackTrace();}
}