我将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+"')");
}
我没有得到如何处理此异常。
答案 0 :(得分:17)
您的多线程应用程序打开了太多的连接/会话。因此,监听器暂时停止并阻止新连接。
首先检查您的数据库资源使用情况:
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;
增加后端并发性。然后重新启动数据库。重要!
答案 1 :(得分:1)
我猜数据库只是不接受来自主机的更多连接。如果我理解你的问题,你可能会制作100个线程,每个线程在短时间内连接到数据库。也许您甚至没有正确关闭连接,或者访问持续时间太长以至于打开了大量连接。数据库有一个限制,它接受连接。
你应该通过一些聪明的技术减少连接数量。也许减少并发线程数和/或使用连接池。
答案 2 :(得分:-1)
在您的最后尝试此解决方案。它对我有用。 在关闭连接后关闭try / catch块中的连接, 写 -
Thread.sleep(1000);
在这种情况下,您可以将其写为 -
finally {
try {
if (conn != null && !conn.isClosed())
{
conn.close();
Thread.sleep(1000);
}
}
catch (SQLException e) {
e.printStackTrace();}
}