4

各スレッドに Resultset オブジェクトを渡しています。各スレッドはデータベースに接続し、データを挿入しています。スレッド110までは正常に動作しています。111 スレッドを超えると、上記の例外がスローされます。

私はオラクル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

マルチスレッド アプリケーションが開いている接続/セッションが多すぎます。したがって、リスナーはしばらくの間、新しい接続をドロップしてブロックします。

最初に DB リソースの使用状況を確認します。

SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');

プロセスまたはセッションの MAX_UTILIZATION が LIMIT_VALUE に近づきすぎていないか確認してください。はいの場合は、次のいずれかを行う必要があります。

  1. DB 接続プーリングを使用してConnection、スレッド間でオブジェクトを共有します。または、
  2. Oracle が同時に処理できるプロセス/セッションの数を増やします。

実際には、接続プーリング (#1) は常に実行する必要があります。そうしないと、アプリケーションをスケールアップできません。詳細については、 Apache Commons DBCPを確認してください。#2 では、新しい SQL*Plus セッションを SYSTEM として開き、次を実行します。

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 に答える