2012-03-15 29 views
1

私はConnectionオブジェクトを作成し、クラスのコンストラクタ(DbTest)でjdbc接続を作成しています。セッションが終了したときにjdbc接続オブジェクトを閉じる

その後、別のJavaクラス(RequestFilter.java)で、私はこのオブジェクトを初期化していますし、HTTPセッションで、このインスタンスオブジェクトを格納し、

DbTest dbtest = new DbTest(); 
session.setAttribute("dbtest", dbtest); 

私の質問は、という接続オブジェクトをクローズする方法がありますセッションが終了すると作成されましたか?または期限切れになると自動的に閉鎖されますか?

答えて

4

HttpSessionListenerを実装し、sessionDestroyed()の方法でクリーンアップを実行できます。しかし、あなたのアーキテクチャは私を心配しています。 HTTPセッションでは未処理のJDBC接続を保存しないでください!あなたが別のサーバーに

  • をHTTPセッションを移行することはできません

    • あなたは簡単に開いているデータベース接続の数千を作成することができ、HTTPセッションは、時間の

    • 99.9%はるかに軽量でデータベース接続アイドル状態です

    • 接続タイムアウトやその他の障害を処理していない可能性があります。

    接続プールではなくユーザーごとに接続する理由はありますか?

  • +0

    私は参照してください。私はこの記事のコメントセクションで十分に追加することができなかったので、Plzは私の質問を次のリンクで詳しく説明しています。http://stackoverflow.com/questions/9723270/making-jdbc-connection-and-storing-in-session –

    0

    HttpSessionBindingListenerを実装できます。

    +0

    'HttpSessionBindingListener':*セッションにバインドまたはバインドされていないときにオブジェクトに通知されます。 OPが期限切れになったときにOPに通知されたい*。 'HttpSessionListener'が良い選択です。 –

    +0

    セッションにバインドまたはバインド解除されたときにオブジェクトに通知を行います。オブジェクトは、HttpSessionBindingEventオブジェクトによって通知されます。これは、サーブレット・プログラマが、セッションが無効化されているか、またはセッションがタイムアウトしたために、セッションから属性を明示的にバインド解除した結果である可能性があります。 – cjstehno

    0

    明示的に接続オブジェクトを閉じる必要があります。 finalizeメソッドでコレクションを閉じることはできますが、finalizeが呼び出されない可能性があるため、推奨されません。より良いアプローチは、この接続を明示的に閉じるメソッドの作成と呼び出しです。コンストラクターでJDBC接続を作成することもお勧めしません。

    0

    接続プールを管理することも問題になります。接続プールから接続を取得するには、同期を使用する必要があります。これにより、他のスレッド(クライアント)が接続プールにアクセスできなくなります。

    関連する問題