改善java web应用程序效率:使用ServletContext缓存数据源

java的数据库连接池很大的提高了效率,但是同时也引入了另一个效率问题, 那就是每次建立连接前都要进行jndi查询以获取数据源,而jndi查询的效率也是比较低的。

解决的方法就是利用ServletContext实现一个全局变量的概念,在每次服务器启动的时候,声明一个数据源,查询jndi获取数据源实例,然后将实例放到ServletContext,以后使用直接取出即可。

具体实现:编写一个类,实现ServletContextListener,在contextInitialized方法中得到数据源实例,放入ServletContext。然后将这个ServletContextListener注册到web.xml。

package pub; //my own class

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.naming.*;
import javax.sql.DataSource;


import javax.servlet.http.HttpServlet;
public class MyListener extends HttpServlet implements ServletContextListener

 private ServletContext context = null;
 
 public void contextInitialized(ServletContextEvent event)
 {  
  
  context = event.getServletContext();
  DataSource ds = null;
  Context ctx=null;
  try
  {
   ctx=new InitialContext();
   ds=(javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/mypool");

  }
  catch(NamingException ne)
  {
   ne.printStackTrace();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  context.setAttribute("ds", ds);
    
   
 } 
 public void contextDestroyed(ServletContextEvent event)
 {  
   
  context.removeAttribute("ds"); 
 }
}

注册:

在web.xml中,连接池配置行之后加入

<listener>
 <listener-class>pub.MyListener</listener-class>
</listener>

这样每次服务启动时就会自动执行contextInitialized方法,以后需要ds时,

DataSource ds = (DataSource)this.getServletContext().getAttribute("ds");

即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值