2011-01-19 15 views
6

Sto usando guice-servlet (2.0) per iniettare una connessione al database all'inizio di ogni richiesta HTTP, ma come posso sapere quando termina la richiesta in modo da poter chiudere la connessione?Pulizia di un oggetto @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(); 

risposta

5

Questo non è possibile in Guice 2.0. Una soluzione alternativa consiste nel registrare un listener di servlet personalizzato che chiude la connessione alla fine di ogni richiesta:

/** 
* 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 non supporta questa di default, ma forse il mio answer ad un'altra domanda può aiutare a ottenere qualcosa da fare.