2011-01-19 9 views
6

各HTTPリクエストの開始時にguice-servlet(2.0)を使用してデータベース接続を注入していますが、リクエストをいつ終了して接続を閉じることができますか?@RequestScopedオブジェクトをクリーンアップしますか?

web.xmlの

<filter> 
    <filter-name>Guice Filter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Guice Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

GuiceServletContextListener

/** 
* Creates a new Database connection. 
*/ 
@RequestScoped 
@Provides 
private Connection getConnection(); 

答えて

5

これはGuice 2.0では不可能です。 1つの回避策は、各要求の最後にConnectionを閉じるカスタムサーブレットリスナーを登録することです。

/** 
* Closes SQL connections at the end of an HTTP request. 
* 
* @author Gili Tzabari 
*/ 
public class ConnectionFilter implements Filter 
{ 
    private final Injector injector; 

    @Inject 
    public ConnectionFilter(Injector injector) 
    { 
     this.injector = injector; 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException 
    { 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
              FilterChain chain) 
     throws IOException, ServletException 
    { 
     Session session = injector.getInstance(Session.class); 

     try 
     { 
      chain.doFilter(servletRequest, servletResponse); 
     } 
     finally 
     { 
      session.close(); 
     } 
    } 

    @Override 
    public void destroy() 
    { 
    } 
} 
1

のGuiceはデフォルトでこれをサポートしていませんが、おそらく別の質問に対する私のanswerは行く何かを得るためにあなたを助けることができます。

関連する問題