2011-01-19 45 views
6

Tôi đang sử dụng guice-servlet (2.0) để chèn một kết nối cơ sở dữ liệu vào đầu mỗi yêu cầu HTTP, nhưng làm thế nào tôi có thể tìm ra khi yêu cầu kết thúc để tôi có thể đóng kết nối?Dọn dẹp một đối tượng @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(); 

Trả lời

5

Điều này là không thể trong Guice 2.0. Một giải pháp khác là đăng ký trình lắng nghe servlet tùy chỉnh để đóng Kết nối ở cuối mỗi yêu cầu:

/** 
* 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 không hỗ trợ này theo mặc định, nhưng có thể tôi answer đến một câu hỏi khác có thể giúp bạn để có được một cái gì đó xảy ra.

Các vấn đề liên quan