2011-01-19 64 views
6

我使用guice-servlet(2.0)在每个HTTP请求的开始处注入数据库连接,但是如何才能找出请求何时结束以便我可以关闭连接?清理@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中是不可能的。一种解决方法是在每个请求结束时注册一个自定义servlet侦听器,以关闭连接:

/** 
* 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

吉斯默认不支持这一点,但可能我answer另一个问题可以帮助你得到的东西去。