利用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;
publicclass ServletContextListenerImpl implements ServletContextListener {
public ServletContextListenerImpl () {
// TODO Auto-generated constructor stub
}
publicvoid contextDestroyed(ServletContextEvent event) {
event.getServletContext().removeAttribute("DataSource") ;
}
publicvoid 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") 获取数据源了。