4

オブジェクトのスコープが解除されたときに、サービスへの接続を閉じる最善の方法を見つけようとしています。

私はこのようなものを持っています:

class something {
  public final LongConnection lc;
  public something ()  {
    lc = new LongConnection ();
    lc.initConnection ();
    new Thread (new Runnable () { 
      public void run () { 
        ReferenceQueue<LongConnection> rq = new ReferenceQueue<LongConnection> ();
        WeakReference<LongConnection> wr = new WeakReference<LongConnection> (lc, rq);

        // now it should start listening for the object to be added to the queue
        while (true) {
          Reference<? extends LongConnection> ref = rq.remove ();
          if (rq != null) { 
            rq.get ().shutdown ();
            break;
          }
        }
        // will fall through and die! 
      }
    }).start ()
  }

このようにして、次のようなものをインスタンス化できます。

somefunction () { 
  something = new something ()
}

メソッドが返される (およびスコープ解除/gc される) と、接続が適切に閉じられます。

質問: (1) これは本当にひどいですか?!?! (2) うまくいきますか (テストは進行中です..)? (3) 何かをシャットダウンする「正しい」方法は何ですか? 回避できるのであれば、シャットダウンの問題をプログラムの次のレイヤーに昇格させたくありません。

4

2 に答える 2

5

はい: Java では、リソースの管理をメモリ管理に結合することは不適切です。メモリ管理以外はすべて明示的に行う必要があります。Java 7 では、関連するボイラープレートを支援する「自動リソース管理」と呼ばれる便利な新しい構造が導入されました。

具体的には、次の点については保証されません。

  1. JVM がオブジェクトに弱い到達可能性があることを認識したとき。
  2. 弱参照がいつクリアされるか。
  3. JVM がその事実を参照キューにエンキューすることによって通知するとき。
于 2012-11-06T10:36:40.277 に答える
1

SQL ResultSetStatementConnectionまたはファイル ハンドルなどの乏しいリソースのガベージ コレクションは、リソースを閉じません。それを取得したメソッドのスコープ内の finally ブロックでそれを行う必要があります。

于 2012-11-06T10:38:44.710 に答える