2011-01-19 10 views
6

Estoy usando guice-servlet (2.0) para inyectar una conexión de base de datos al comienzo de cada solicitud HTTP, pero ¿cómo puedo saber cuándo finaliza la solicitud para poder cerrar la conexión?¿Limpiar un objeto @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(); 

Respuesta

5

Esto no es posible en Guice 2.0. Una solución consiste en registrar un escucha de servlet personalizado que cierra la conexión al final de cada solicitud:

/** 
* 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 no soporta esto por defecto, pero posiblemente mi answer a otra pregunta puede ayudarle a poner algo en marcha.