1

データベースの接続プールメカニズムにより、多くのトランザクション間でデータベースを開いたままにして、最後にのみデータベースを閉じることができることを私は知っています。Java コードから UNIX マシンに接続するためにsshxcute( http://code.google.com/p/sshxcute/ ) を使用しています。しかし、異なるJavaファイルからUNIXコマンドを実行する必要がある場合は、マシンへの接続からのプロセス全体が行われます。このマシンへの多くの呼び出し間でセッションを開いたままにしたい。これを達成する方法。基本的に、接続プールのようなメカニズムが必要です。これにより、UNIXマシンに1回だけオープン(接続)し、さまざまなJavaクラスまたはメソッドから必要なだけ多くの命令を実行し、最後にUNIXマシンへのセッション/接続を一度閉じます。 .

4

2 に答える 2

0

そのようなプールを作成する必要がありました。それほど難しくありません。一言で言えば、私の一般的なアプローチは次のとおりです。

  1. プールを管理するクラスを作成します。

  2. そのクラスで、使用可能な接続を保持する Collection を作成します。(ああ、いい韻です。) おそらく LinkedList ですが、ArrayList などの可能性もあります。現在使用中の接続を保持する 2 つ目の Collection を作成します。最初、これらのコレクションは空です。

  3. そのクラスで、接続を要求するために呼び出すことができる関数を作成します。この関数は、プールに接続があるかどうかをチェックします。存在する場合は、1 つを選択して使用可能なコレクションから削除し、使用されているコレクションに追加して、呼び出し元に返します。そうでない場合は、新しいコレクションを作成し、使用されているコレクションに追加して、呼び出し元に返します。

  4. 接続を解放するために呼び出すことができる関数を作成します。その関数は、コレクションをパラメーターとして受け取り、使用されているコレクションから削除し、使用可能なコレクションに追加します。(使用されたコレクションにない場合は、誰かがプールを経由せずに接続を取得したことを意味します。使用可能なコレクションに追加するか、単に閉じて破棄することをお勧めします。)

基本的にはそれだけです。もちろん、考慮すべき詳細がたくさんあります。お気に入り:

接続の最大数に制限を設ける必要がありますか? その場合、提供した接続の数を数えておく必要があります。新しいリクエストがその制限を超える場合は、接続を返す代わりに例外をスローします。(または、処理方法によっては、null を返すこともあります。)

使用可能なプールに保持する接続数に制限を設ける必要がありますか? その場合、接続が解放されたときに、使用可能なプールに自動的に追加するのではなく、プールがすでに最大サイズに達しているかどうかを確認し、そうであれば、接続をプールに戻す代わりに閉じます。

get-connection 関数が接続を返す前にテストすることをお勧めします。たとえば、接続がプールにある間にタイムアウトになった可能性があります。おそらく、低コストのメッセージを送信して、有効な応答を確実に受け取ることができます。

使用済みのコレクションを持つ主な理由は、接続リークを監視できるようにするためです。つまり、誰かが接続を要求し、それを決して返さないなどです。接続を使用済みのコレクションに直接入れるのではなく、通常はラッパー オブジェクトを作成して保持し、それが与えられた時間を保持します。次に、使用されたコレクションをループし、途方もなく長い時間そこにあったものがあるかどうかをチェックするタイマーで呼び出される関数を入れます。接続の種類によっては、最後に実際に使用されたのがいつかを確認したり、他のテストを行って、呼び出し元が本当にまだ使用しているかどうか、または接続リークであるかどうかを確認できる場合があります。接続リークを認識できる自信がある場合は、それを閉じるか、使用可能なプールに戻すことができます。それ以外の場合は、少なくともログにメッセージを書き込み、ログを定期的にチェックして、リークの問題があるかどうかを確認し、それらを突き止めることができます。接続リークの追跡を行わない場合、使用されたコレクションはおそらく不要であり、削除できます。

于 2012-09-21T16:33:59.253 に答える
0

ここにいくつかのアイデアがあります:
A. オブジェクト プールを使用します。たとえば、これを使用できます
これにより、複数の Unix 接続のプールを保持できます。B.アプリケーションレベルで何らかのセッション管理を行い
、プールから取得したオブジェクトへの参照を保持するセッションコンテキストを保持します。
セッションが開始されると、プールから接続を取得しようとします。
セッションが終了したら、接続をプールに戻します。

アプリケーション セッションとプールに保持されているオブジェクトの比率が 1:1 ではない可能性があることに注意してください。
これを処理するために考えられる戦略は、初期サイズ X でプールを作成し、必要に応じてサイズ Y まで大きくすることです。

対処する必要があるもう 1 つの問題は、おそらく、何らかの「キープ アライブ」チェックを行って、接続が有効であることを確認することです。
ここで考えられる 2 つの戦略は次のとおりです
。ピング)。
B. プールの接続の 1 つが切断された場合は、新しい接続を作成します。

于 2012-09-21T16:34:26.427 に答える