2016-12-11 7 views
0

私はWebアプリケーションを持っています。 Jerseyを使用してREST Webサービスを実装しました。したがって、私のコントローラはJersey ServletContainerサーブレットであり、それはjarファイル内にパッケージ化されています。 ここで、n個の顧客が自分のアプリケーションに接続し、APIエンドポイントを通じてDBからデータを取得しているとします。 私はすべての顧客が接続を取得できる場所からグローバル接続プールを使いたいので、接続作成のオーバーヘッドを減らすことができます。 したがって、私はコントローラのサーブレットのinit()またはcontextInitialized()メソッドに入れていると思っていましたが、ジャージーコントローラがクラスファイルとしてジャージーのjarファイル内にすでにパッケージ化されているため、だから私はコンテキストを作成する世話をするGenericConnectionクラス内の静的なブロックを作成してコードを実装しているので、毎回コンテキストを作成しないようにしています。ここではJDBC接続プールがどのように役立つか

public class GenericConnection { 
    static DataSource dataSource; 
    Connection con; 

    static { 
     try{ 
      System.out.println("1 and thats all"); 
     Context initContext = new InitialContext(); 
     Context envContext = (Context)initContext.lookup("java:/comp/env"); 
     dataSource = (DataSource)envContext.lookup("jdbc/moodoff_notificationRead_DB"); 
     } 
     catch(Exception ee){ 
      ee.printStackTrace(); 
     } 
    } 
    // Get a connection from the connection pool 
    public Connection getNewConnection(){ 
     try { 
      con = dataSource.getConnection(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return con; 
    } 
} 

しかし、私はすべてのユーザーの要求に対して、グローバルプールを作成し、そこからの接続を共有できるかどうかはわかりません。 私は意図的に静的ブロックを作成し、その中にすべてを入れて、一度しか初期化されないようにします。 本当に私が欲しいものを達成するのに役立つでしょうか?そしてもし私がそれにすることができる他の調整があれば。 ありがとうございます!

+0

はい、それは役に立ちます。しかし、あなたのコードはスレッドセーフではありません。 ConnectionはgetNewConnection()の** local **変数でなければなりません。そして、なぜ 'getNewConnection()'がなぜ静的でないのかは分かりません。そして例外を捕まえて無視するべきではありません。 –

+0

@JBNizet:ありがとう!!同期することで、静的コード部分をスレッドセーフにするように教えてもらいたいですか?私が見るのは、最初のGET要求を出した後のことです。この静的ブロックは、コンソールで行が印刷されるときに実行されます。つまり、最初の要求が発生したときやサーバーの起動時に接続プールが作成されます。 – Santanu

+0

静的ブロックは、それを含むクラスが初期化されたときに実行されます。最初のリクエストの前にクラスが使用されていない場合は、最初のリクエストでこのコードが実行されるのが普通です。私は同期について何も言わなかった。 'con'変数はgetNewConnection()メソッドのローカル変数ではなくインスタンス変数であるため、あなたのコードはスレッドセーフではないと言いました。 –

答えて

1

コンテナで実行している場合は、すでに接続プールを使用している可能性があります。妥当な最大接続数で正しくセットアップされていることを確認してください(DBがその数をサポートできるようにしてください)。

コンテナの外でも、独自のプーリングメカニズムを作成しないでください。

関連する問題