利用ServletContextLinstener获取并缓存数据源

 
           利用 ServletContextLinstener 获取数据源
我们在设计 web 应用程序的时候,在保证功能实现的基础上就会考虑增强应用程序的性能,我们通常会在 web 服务器开始时缓存一些静态数据或者完成一些代价昂贵的操作。 一个最佳实践是使用实现了 javax.sql.DataSource 接口的 JDBC 连接池。
DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作,而且严重影响了应用的性能。我不建议每次查找数据源建立连接等,相反,我们可以在服务器启动时就缓存DataSource,这样就可以大大提高性能。这一节我 们就学习如何使用 ServletContextLinstene 来完成数据源的查找。
Servlet的应用程序时间管理机制可以使编程者方便的控制ServletContext,HttpSession和ServletResuqst的生命周期。在程序中使用动作监听器可以根据servlet的运行状态更加有效的使用Web服务器资源。
ServletContext 监听器
ServletContext事件监听器包括两个监听器接口:ServletContextLinstener和ServletContextAttributeListener。在这里我们只关心ServletContext中ServletContextLinstener接口。
事件类型
解释
监听器接口
接口方法
ServletContext事件
Web应用程序(即ServletContext)刚被创建并能够处理web请求,或者web应用程序即将被关闭
Javax.servlet.
ServletContextLinstener
contextInitialized (ServletContextEvent event)
contextDestroyed (ServletContextEvent event)
 
 由于ServletContext先于其余的Servlet触发,所以我们可以在 ServletContextLinstener contextInitialized (ServletContext
Event event) 方法中获取 DataSource 并将其防止在 ServletContext 中,这样应用程序就不必每次都要查找数据源,而在 contextDestroyed(ServletContext
Event event) 中删除 DataSource
 
有了以上的思路,我们就可以动手编写我们的代码了:
Package   com.ty.lintener ;
 
import javax.naming.*;
import javax.servlet.*;
import javax.sql.DataSource;
 
 
public class ServletContextListenerImpl implements ServletContextListener {
 
   public ServletContextListenerImpl () {
      // TODO Auto-generated constructor stub
   }
 
   public void contextDestroyed(ServletContextEvent event) {
      event.getServletContext().removeAttribute( "DataSource" ) ;
   }
 
   public void contextInitialized(ServletContextEvent event) {    
      ServletContext application = event.getServletContext() ;
      String name = application.getInitParameter( "DataSource" ) ;
     
      if (name != null ) {
         try {
            InitialContext context = new InitialContext() ;
            DataSource ds = (DataSource)context.lookup(name) ;
           
            if (ds != null ) {
                application.setAttribute( "DataSource" , ds) ;
            }
         } catch (NamingException e) {
            e.printStackTrace();
         }
      }
   }
}
因为 ServletContextListenerImpl 是一个监听器,所以我们还要在 web.xml 中配置监听器:
< context-param >
       < param-name > DataSource </ param-name >
       < param-value > java:comp/env/jdbc/bbs </ param-value >
  </ context-param >
 
< listener >
        < listener-class >
com.ty.listener. ServletContextListenerImpl
</ listener-class >
  </ listener >
在上面的配置中我们使用到了数据源的名称,所以才有 < context-param > 这个标签。
 
这样我们就在我们的 web 程序中完成了数据源的查找和缓存,调用的时候就可以使用
(DataSource)getServletContext().getAttribute( "DataSource" ) 获取数据源了。
 

 

你可能感兴趣的:(Web,servlet,application,import,web服务,Constructor)