利用
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"
)
获取数据源了。