0

私はJSPを使用して小さなWebアプリケーションを開発しています。このアプリケーションには、サーブレットで提供するデータベース接続が必要です。

問題は、サーバー上のすべてのファイルがこのクラスを使用して、新しい接続を作成するたびにデータベースにアクセスできるようにすることです。実際、すべてのファイルで新しいDatabaseオブジェクトを作成し、毎回新しい接続が確立されます。 。

sessionこれを回避する方法はありますか?おそらく、やなどのグローバルオブジェクトを宣言して、request1回だけ初期化され、すべてのJSPファイルで使用されるようにしますか?

ありがとう

4

3 に答える 3

4

なぜあなたはこれをしたいのですか?どちらの解決策も間違った方法です。

データベース接続はスレッドセーフではないため、これは悪い考えです。グローバルオブジェクトを作成すると、すべてのユーザーが接続を共有する必要があるため、アプリのスループットが低下します。

より良い解決策は、アプリサーバーによって維持される接続プールを持つことです。JNDIルックアップを実行してプールから接続をチェックアウトし、可能な限り狭いスコープで使用して、そのメソッドスコープで接続を閉じます。

アプリのスケーリングが向上し、スレッドセーフのリスクがなくなります。

于 2013-03-11T13:10:48.177 に答える
2

グローバル変数は必要ありません。アプリケーションで使用されるコンテキストの機能が必要です。したがって、JNDIを使用する必要があります。TomcatのWebページには、その方法が記載されており、簡単に実装できます。よろしくお願いします。

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

于 2013-03-11T13:15:05.603 に答える
0

あなたはJSPファイルから直接データベース接続を使用することについて話しているようですよね?まあ、これは理論的に正しい解決策ではありません。関心の分離の原則に従うと、ビュー(JSPファイル)はデータベースやデータアクセスについて何も知らないはずだからです。MVCパターンの説明を確認してください。たとえば、これは非常に明白です;-):

MVCパターンに関するウィキペディア

しかし、ショートカットを使用してデータベースをビューに認識させたい場合は、2つのオプションがあります。どちらも、Marcelo Tatajeがすでに述べたように、アプリケーションで以前に定義されたデータソースのJNDIルックアップを含みます。

Tomcatで接続プールに基づいてJNDIデータソースを定義する方法について:

http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

同じページで、この接続プールを使用して、JSPから直接クエリを発行する方法を確認できます(これも私の意見では非常にお勧めできません)

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/TestDB">
select id, foo, bar from testdata
</sql:query>

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>

  <h2>Results</h2>

<c:forEach var="row" items="${rs.rows}">
    Foo ${row.foo}<br/>
    Bar ${row.bar}<br/>
</c:forEach>

  </body>
</html>

java.sql.Connectionスレッドは安全ですか?

もう少し良い解決策は、Javaコードで、JNDIがコンテキストリスナーから次のようにデータソースをルックアップすることです。

    public void contextInitialized(ServletContextEvent contextEvent) {
        // JNDI Datasource lookup   
        InitialContext context = new InitialContext();
        DataSource dataSource = (DataSource) context
                .lookup("jdbc/DataSource");
        // Storing datasource in application context
        contextEvent.getServletContext().setAttribute("datasource",dataSource);
   }

サーブレットから保存されたデータソースを使用して、このように必要なデータベース接続を取得した後

((DataSource)contextEvent.getServletContext().getAttribute("datasource")).getConnection()

Connectionクラスを直接使用しないでください。それはひどく原始的で時代遅れです。今日、深刻な職場環境では、そのような接続を処理する人は誰もいません。AmitGが提案したことを実行すると、すべての同時アクセスで共有される一意の接続になります。これが進むべき道ではない理由については、こちらをご覧ください

于 2013-03-12T03:16:02.753 に答える