日期:2014-05-18  浏览次数:20768 次

ServletContextListener在Tomcat中的配置问题
我的web.xml配置如下,用的是proxool进行数据库连接:
    <servlet>
          <servlet-name> proxoolServletConfigurator </servlet-name>
          <servlet-class> org.logicalcobwebs.proxool.configuration.ServletConfigurator </servlet-class>
          <init-param>
              <param-name> xmlFile </param-name>
              <param-value> WEB-INF/proxool.xml </param-value>
          </init-param>
          <load-on-startup> 1 </load-on-startup>
      </servlet>
      <servlet>
        <servlet-name> proxoolAdmin </servlet-name>
        <servlet-class> org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name> proxoolAdmin </servlet-name>
        <url-pattern> /proxooladmin </url-pattern>
      </servlet-mapping>
     
      <listener>
          <listener-class> com.mission.init.SysContextListener </listener-class>
      </listener>  

在里面配置了一个tomcat监听器,监听器执调用Java的TimerTask执行一个定时任务。未配置监听器的时候tomcat都是可以正常启动,数据库连接池也是建立好了的,但就是配置了这个监听器之后,每次tomcat启动的时候都要报错,出错信息如下:

org.logicalcobwebs.proxool.ProxoolException:   Attempt   to   refer   to   a   unregistered   pool   by   its   alias   'Develop '
at   org.logicalcobwebs.proxool.ConnectionPoolDefinition.doChange(Connecti
onPoolDefinition.java:250)
                at   org.logicalcobwebs.proxool.ConnectionPoolDefinition. <init> (Connection
PoolDefinition.java:147)
                at   org.logicalcobwebs.proxool.ProxoolFacade.registerConnectionPool(Proxo
olFacade.java:96)
                at   org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:7
7)

其中那个Develop是我在proxool.xml中配置的别名,是没有问题的。而且,tomcat也可以启动,也可以正常访问数据库。

经我的分析觉得可能是因为前面那个servlet即数据库连接还没有建立的时候监听器就已经初始化了,因此一直都是报没有注册连接池的错误。

请问这个问题如何解决??tomcat是先执行listner再执行servlet,是这样的么??

------解决方案--------------------
如果是你的分析原因
我记得servlet可以设置优先级的
或许可以把serlet的启动优先级设高一点
让他优先运行
<load-on-startup> 1 </load-on-startup>

也就是这个参数
------解决方案--------------------
把顺序换一换就行了
------解决方案--------------------
在带有监听器的servlet中,执行的顺序是这样的,首先建立servletListerner,然后运行,初始化ServletContext,然后监听ServletContext的变化,最后ServletContext被销毁,加ServletListener的时候不用添加其他的什么配置只在web.xml里面加上监听器就可以了,我不知道是什么错误,供你参考把,
------解决方案--------------------
你把
<listener>
<listener-class> com.mission.init.SysContextListener </listener-class>
</listener>
放到 <servlet> 上面,