我将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+"')");
}我不知道如何处理这个异常。
发布于 2013-04-26 15:41:34
您的多线程应用程序打开的连接/会话太多。因此,监听程序会在一段时间内丢弃和阻止新连接。
首先检查您的DB资源使用情况:
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');检查您的进程或会话的MAX_UTILIZATION是否离LIMIT_VALUE太近。如果是,您应该:
Connection对象。或者,提供服务的进程/会话数
实际上,应该始终执行连接池(#1)。否则,应用程序就无法向上扩展。有关详细信息,请查看Apache Commons DBCP。对于#2,以SYSTEM身份打开一个新的SQL*Plus会话并运行:
ALTER system SET processes=<n-as-per-number-of-threads> scope=spfile;增加后端并发性。然后重新启动数据库。重要!
发布于 2013-04-26 15:05:00
我猜数据库只是不接受来自你的主机的更多连接。如果我对你的问题理解正确的话,你可能会在短时间内创建100个线程,每个线程都连接到数据库。也许你甚至没有正确地关闭连接,或者访问持续的时间太长,以至于打开了大量的连接。数据库有接受连接的限制。
你绝对应该通过一些聪明的技巧来减少连接的数量。可以减少并发线程的数量和/或使用连接池。
发布于 2016-10-19 18:56:13
在您的终端尝试此解决方案。这对我很管用。关闭try/catch块中的连接,并在关闭连接后写入-
Thread.sleep(1000);在这种情况下,您可以将其编写为-
finally {
try {
if (conn != null && !conn.isClosed())
{
conn.close();
Thread.sleep(1000);
}
}
catch (SQLException e) {
e.printStackTrace();}
}https://stackoverflow.com/questions/16230446
复制相似问题