2011-01-19 38 views
6

Her bir HTTP isteğinin başına bir veritabanı bağlantısı enjekte etmek için guice-servlet (2.0) kullanıyorum, ancak isteğin ne zaman sona erdiğini nasıl bulabilirim, böylece bağlantıyı kapatabilir miyim?@RequestScoped bir nesneyi temizleme?

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> 

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

cevap

5

Bu Guice 2.0'da mümkün değildir. Bir geçici çözüm, her bir isteğin sonunda Bağlantıyı kapatan bir özel sunucu dinleyicisinin kaydedilmesidir:

/** 
* 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 varsayılan olarak bu desteklemez GuiceServletContextListener ama muhtemelen benim bir şey olacak almak için yardımcı olabilir Başka bir soruya answer.