4

我将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+"')");

       }

我不知道如何处理这个异常。

4

3 回答 3

20

您的多线程应用程序打开了太多的连接/会话。因此,侦听器会丢弃并阻止新连接一段时间。

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

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=<n-as-per-number-of-threads> scope=spfile;

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

于 2013-04-26T07:41:34.250 回答
1

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

您绝对应该通过一些巧妙的技术来减少连接数。也许减少并发线程的数量和/或使用连接池。

于 2013-04-26T07:04:59.697 回答
-1

最后尝试此解决方案。它对我有用。在 try/catch 块中关闭连接,并在关闭连接后,写入 -

Thread.sleep(1000);

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

finally {
            try {
                if (conn != null && !conn.isClosed())
                    {
                    conn.close();
                    Thread.sleep(1000);
                     }
                }
            catch (SQLException e) {
                e.printStackTrace();}
}
于 2016-10-19T10:56:12.890 回答