我传递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+"')");
}
我没有得到如何处理这个异常。
你的多线程应用程序打开太多的连接/会话。 因此,听者正在下降和阻塞了一段新的连接。
首先检查你的数据库资源使用:
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
请检查您是否为MAX_UTILIZATION无论您的流程或会话的方式是太接近了LIMIT_VALUE。 如果是的话,你应该:
- 使用DB连接池共享
Connection
线程之间的对象。 要么, - 增加的过程中,甲骨文可以同时服务/会话的数量。
事实上,连接池(#1)应始终做到。 一个应用程序不能以其他方式扩大规模。 检查的Apache下议院DBCP了解详情。 #2,打开一个新的SQL * Plus会话系统并运行:
ALTER system SET processes=<n-as-per-number-of-threads> 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();}
}
文章来源: java.sql.SQLException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found