0

こんばんは!私はlogin-logoutを備えたWebアプリを持っており、そこでいくつかの製品を売買することができます。私のクエリはDBManager、サーブレットから呼び出される静的メソッドのみを持つ、と呼ばれるJavaクラスに格納されます(このプロジェクトではJSPを使用できないため、教授がこの制約を与えてくれるため、JSPは使用できません)。

だからここに問題があります:私はとの接続を管理するために使用しましたServletContextListenercontextInitialized接続を設定し、シャットダウンcontextDestroyedしました。属性「接続」は、を使用して保存されServletContext.setAttribute(Connection)ます。

このパラメータを(サーブレットではなく)Javaクラスから取得するにはどうすればよいDBManagerですか?getServletContext()サーブレット内を使用してオブジェクトを取得し、それを属性として渡す必要がありますか、それともそれを回避するためのショートカットがありますか?

4

3 に答える 3

4

メソッド contextInitialized で接続を開き、contextDestroyed で接続を閉じることは、悪い解決策です。Web サイトに同時に 2 人の訪問者がいるとします。それらは同じデータベース接続を共有するようになりました。トランザクションを扱う場合、あるビジターが別のビジターによって実行されたトランザクションの中間状態をコミットするという予期しない結果が生じる可能性があります。また、接続が失われた場合 (おそらく DB サーバーが再起動されたために)、接続が再確立されないため、アプリケーションは失敗します (非常にスマートな JDBC ドライバーを使用している場合を除く)。

非常に高価ですが安全な解決策は、データベース操作ごとに新しい接続を開き、操作の直後に再度閉じることです。

完璧なソリューションを得るには、ある種の接続プールを使用します。データベース ステートメント (または一連のステートメント) を実行する必要があるときはいつでも、プールから接続を借用します。終了したら、接続をプールに戻します。ほとんどのプール実装は、検証 (接続がまだ「生きている」かどうかを確認する) などを処理し、複数のスレッド (さまざまな訪問者が同時に送信するさまざまな HTTP 要求) を並行してステートメントを実行できます。

このソリューションを利用したい場合は、Commons DbUtils ライブラリが適しているかもしれません: http://commons.apache.org/dbutils/

または、Java アプリケーション サーバーまたはサーブレット エンジン (Tomcat?) のドキュメントを調べて、それが提供する組み込みの DB 接続プール機能を確認します。

于 2012-11-21T19:55:45.640 に答える
1

任意に接続を取得する代わりに、接続を受信するようにクラスを変更できます。これにより、接続の任意のインスタンスを渡すことができます (別のデータベースからデータを取得する必要がある場合はどうなりますか?)。

また、コードがデスクトップに移植されると想像してください。このアプローチを使用すると、DAOを変更せずに再利用できます。

class DBManager {
  private Connection connection;

  public DBManager(Connection connection) {
    this.connection = connection;
  }
  //methods that will use the connection
}
于 2012-11-21T19:51:39.007 に答える
0

HttpServlet doPostまたはメソッドで、doGetを呼び出すことができますgetServletContext()

ServletContext sc = getServletContext();
DataSource ds = (DataSource) sc.getAttribute("ds");
Connection conn = ds.getConnection();

サーブレットは、名前によってオブジェクト属性をコンテキストにバインドできます。コンテキストにバインドされた属性は、同じ Web アプリケーションの一部である他のサーブレットで使用できます。

コンテキスト属性は、それらが作成された JVM に対してローカルです。これにより、ServletContext 属性が分散コンテナー内の共有メモリ ストアになることを防ぎます。分散環境で実行されているサーブレット間で情報を共有する必要がある場合、情報をセッションに配置するか、データベースに格納するか、Enterprise JavaBeans コンポーネントに設定する必要があります。

于 2012-11-21T19:52:36.050 に答える