2011-02-25 20 views
7

如果我更早在Context和InitialContext中查看了Java SE6文档,我会看到每个方法都有一个close()方法。Context和InitialContext - 我应该在这些对象上调用close()方法吗?

所以现在我想知道,我是否需要调用Context/InitialContext对象上的close()方法?

这是我典型的servlet代码片段,以及如何使用Context/InitialContext对象。

public class MyTypicalServlet extends HttpServlet {  

    //thread safe 
    DataSource ds; 
    String FilePath;  

public void init(ServletConfig config) throws ServletException { 

    super.init(config); 
    try { 
     final Context ctx = new InitialContext(); 
     ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB"); 

     FilePath = getServletContext().getInitParameter("FilePath");     

    } catch (NamingException e) { 
     throw new ServletException("Unable to find datasource: " + e.getMessage(), e); 
    } 
}    

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
    { 
     doPost(req,res); 
    } 

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
    {  

    //...a bunch of code 
    } 

}//class   
+0

我确实调用'close()',但实际上没有impl。做任何事情,因为你可以有subContexts等等。 – bestsss 2011-02-25 18:19:26

回答

6

这是一个很好的习惯。例如,我总是确保关闭我的InputStream类,即使我使用的是ByteArrayInputStream,其中close()方法是无操作的。这样,如果稍后将其更改为其他某种实施方式,那么也不得不进行更改。

同样的情况在这里 - 如果你调用close(),你会更加兼容任何JNDI实现。

7

close方法允许释放上下文使用的资源,而不是等待GC释放它们。这对于需要与例如数据库或外部系统开放连接的环境可能是有用的。但我很确定它对java:comp/env上下文没有用处。无论如何,我从来没有看到任何代码关闭它们。

+0

由于我打开与上下文的连接到我的数据库,我应该使用close()上下文吗?...它会对我有什么好处吗?我使用相当多的内存,因为它是我的web应用程序,所以我不知道是否更快地释放对象,等待GC做这些对我来说是有用的。你对此有何看法? – katura 2011-02-25 18:48:46

+0

您不打开与上下文的数据库连接。你可以访问一个DataSource,它可以访问你打开的连接。连接不知道上下文,并且与它无关。关闭背景是一个很好的做法,但在这种情况下我不会介意太多。 – 2011-02-25 19:14:23

相关问题