1

私は待機と通知を使用するのが初めてです。コードのテストに問題があります。以下は私の実装です:(注:すべての実装は含まれていません)

public class PoolImp {
  private Vector<Connection> connections; // For now maximum of 1 connection


  public synchronized Connection getconnection() {
       if(connections.size == 1() ) {
         this.wait();
     }
      return newConnection(); // also add to connections
  }

 public synchronized void removeconnection() {
       connections.size = 0;
       this.notify();
  }

}

以下は私のテスト方法です: conn_1 は最初の接続を取得します。最大 1 つの接続しか許可されていないため、conn_2 は待機状態になります。

これをテストして、removeconnection を呼び出したときに conn_2 が通知を受け、解放された接続を取得するようにします。

テスト: @Test

 public void testGetConnections() throws SQLException
{  
  PoolImpl cp = new PoolImpl();
  Connection conn_1 = null;
  Connection conn_2 = null;
  conn_1 = cp.getConnection();
  conn_2 = cp.getConnection();
  cp.removeConnection(conn_1);}
}   
4

3 に答える 3

2

待機と通知をテストするには、複数のスレッドが必要です。そうしないと、同じスレッド上にあるため、待機中のスレッドがブロックされ、通知コードに到達することはありません。

PS接続プールの実装は簡単なことではありません。既製品でもいいので気にしません。

于 2012-01-31T18:13:20.893 に答える
0

ifブロックをwhileループに置き換えることは改善ですが、ここでの実際の問題は解決されません。通知が発行された後、コレクションのサイズを再度強制的にチェックして、notify()の発行中に行われたクレームの有効性を確認します。

前に指摘したように、これをシミュレートするには複数のクライアントスレッドが必要です。conn_2 = cp.getConnection();を呼び出すと、テストスレッドがブロックされます。

現在、この呼び出しを発行する機会はありません。これは、(中断されない限り)無期限に待機するためです。cp.removeConnection(conn_1);

于 2012-01-31T19:51:43.297 に答える
0

接続プール用の既製のクラスを受講する必要があります。しかし、あなたが主張するなら、私はあなたのためにコードを修正しました:

public class PoolImp {
  private Vector<Connection> connections; // For now maximum of 1 connection


  public synchronized Connection getconnection() {
       while(connections.isEmpty()) {
         this.wait();
     }
     return newConnection(); 
  }

 public synchronized void removeconnection(Connection c) {
       connections.add(c);
       this.notify();
  }

}

于 2012-01-31T18:33:41.023 に答える