2012-01-21 8 views
2

私はポスト/取得要求を処理するメインサーブレットを持っています。
私は、接続プール(のGlassFish v3のではjdbc/mysqlの)を使用していますし、私のサーブレットのコードは次のとおりです。
jdbcデータソースv/sを渡してConnectionオブジェクトを渡す - サーブレットからJavaクラスへ

public class Controller extends HttpServlet { 
private DataSource datasource; 
@Override 
public void init() throws ServletException { 
     super.init(); 
    try { 
     //Database Connection pooling: 
     InitialContext ctx = new InitialContext(); 
     datasource = (DataSource)ctx.lookup("jdbc/MySQLPool"); 
     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
private Connection getConnection() throws SQLException { 
    return datasource.getConnection(); 
    } 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    Connection connection=null; 
    try { 
      connection = datasource.getConnection(); 
      Object obj= cmdFactory.getInstance().getCommand(Cmd).execute(connection); 
     } 

等...と最終的に私は接続を閉じ、ブロック内のサーブレットの終わりに

これで、アプリケーションの下位レイヤーを介して他の(サーブレット以外の)Javaクラスで使用されるように、最後の行のパラメータとして「接続」オブジェクトを渡しています。これは間違っていますか?むしろデータソースオブジェクトを渡す方が良いでしょうか(そして、特定のクラスではdatasource.getConnection()を実行します)?または他のJavaクラスでこの接続を取得するために使用できる"getServletContext()。getAttr(database)"のようなものがありますか?

答えて

3

DataSourceを使用すると、ほとんどの場合、接続プールからJDBC接続を取得できます。サーブレット環境では、DataSourceへの接続を2回要求すると、2つの異なる接続が確立されます。

DataSourceを渡すことは意味がありません。コールのチェーン内のすべてのオブジェクトに同じ接続を使用させ、最後にコミットします。

そして、データソースから取得したメソッドによって接続を閉じなければなりません。そうしないと、プールは接続をリークし、すぐに使用可能な接続がなくなります。

+0

私はそれを忘れていたので私を思い出させるためにあなたが絶対に正しいです漏れに関するええとええ! – shadesco

+0

質問:どのように近似したり計算したりするのですか?特定のWebアプリケーションの接続プールサイズはどのようにする必要がありますか?私は接続プーリングを使用しているのですが、glassfishのデフォルトパラメータを使用したのは初めてです – shadesco

+1

同時ユーザー数、データベースが実際にサポートしている接続数、スレッドプール内のスレッド数によって異なります。予想される同時ユーザー数でアプリケーションをロードテストし、最適な数が何であるかを確認する必要があります。そして、現実があなたの期待と一致するかどうかを検証しなければなりません。 –

関連する問題