私は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;
}
}
しかし、私はすべてのユーザーの要求に対して、グローバルプールを作成し、そこからの接続を共有できるかどうかはわかりません。 私は意図的に静的ブロックを作成し、その中にすべてを入れて、一度しか初期化されないようにします。 本当に私が欲しいものを達成するのに役立つでしょうか?そしてもし私がそれにすることができる他の調整があれば。 ありがとうございます!
はい、それは役に立ちます。しかし、あなたのコードはスレッドセーフではありません。 ConnectionはgetNewConnection()の** local **変数でなければなりません。そして、なぜ 'getNewConnection()'がなぜ静的でないのかは分かりません。そして例外を捕まえて無視するべきではありません。 –
@JBNizet:ありがとう!!同期することで、静的コード部分をスレッドセーフにするように教えてもらいたいですか?私が見るのは、最初のGET要求を出した後のことです。この静的ブロックは、コンソールで行が印刷されるときに実行されます。つまり、最初の要求が発生したときやサーバーの起動時に接続プールが作成されます。 – Santanu
静的ブロックは、それを含むクラスが初期化されたときに実行されます。最初のリクエストの前にクラスが使用されていない場合は、最初のリクエストでこのコードが実行されるのが普通です。私は同期について何も言わなかった。 'con'変数はgetNewConnection()メソッドのローカル変数ではなくインスタンス変数であるため、あなたのコードはスレッドセーフではないと言いました。 –