tomcat启动时,定时器任务连接不上数据库

caoyishuai 2012-08-31 09:56:23
现在做的一个web项目中,因为用到定时器,在配置文件中有一个要求是每隔几天的几点执行一次,我的想法是在定时器中计算当前时间与要求时间的时间差,然后延迟这个时间差去执行,但是后来发现,tomcat启动的时候定时器就会执行这里了,而配置文件的时间需要去数据库取,这个时候tomcat刚启动,数据库是访问不了的,请问有没有什么方法可以再启动的时候获取到这些数据。


event.getServletContext().log("定时器已启动");

timer.schedule(new TimerAction(),datenow,30*1000);
timer.schedule(new TimerAction2(),datenow,70*1000);

event.getServletContext().log("已经添加任务");


还有个问题就是这样写两个定时器任务可以不,运行倒是正常能运行。
...全文
412 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
suciver 2012-09-03
  • 打赏
  • 举报
回复
楼主还是没能理解我的意思,数据库是跟tomcat无关的,你所谓的加载数据库是说自己写的访问数据库类不是tomcat连接数据库是你编写的类访问数据库.你一直说tomcat连接数据库,这当然是无关的,因为tomcat本身和数据库是分离的,只是你的dao去访问了数据库.这点一定要搞清楚.之所以用listener会出现这个问题.原因就在于tomcat的启动过程.是listener最优先加载启动的.其次才去加载tomcat下的其他服务类.所以你如果使用listener去调用你访问数据库的类,那么因为你listener优先加载而此时的dao还未加载就出现了这种情况.而用servlet是在tomcat加载服务类时启动的,那么这时其它的servlet也都会被tomcat这个web容器所加载,自然就不会出现类未被加载的情况.
caoyishuai 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

你数据库服务关tomcat什么事啊,你数据库服务启动那边,跟tomcat是无关的.
[/Quote]

怎么会是无关呢,tomcat启动时,解析web.xml时,如果用listner形式的话,会先去执行listner中的类,这个时候tomcat还没有连接上数据库,所以想要获取里面信息就获取不到的啊。你可以写个测试类试下,在listener定义的这个类中去访问,看是不是报错。
suciver 2012-09-03
  • 打赏
  • 举报
回复
你数据库服务关tomcat什么事啊,你数据库服务启动那边,跟tomcat是无关的.
caoyishuai 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 suciver 的回复:]

什么叫加载数据库?你的项目是不是被spring管理,而你的问题是关于操作数据库的bean怕在servlet启动后,spring还没初始化完成吗?
[/Quote]

不是spring管理的,就是tomcat启动的时候先加载了listner,这个时候我在定时器中需要取数据库信息,而数据库还没加载好呢。我试了下用servlet的方式是可以实现的,只是具体原理不太清楚,应该是牵扯到tomcat启动加载服务顺序问题。
suciver 2012-09-03
  • 打赏
  • 举报
回复
只要记住tomcat的加载顺序listener->filter->servlet
caoyishuai 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

楼主还是没能理解我的意思,数据库是跟tomcat无关的,你所谓的加载数据库是说自己写的访问数据库类不是tomcat连接数据库是你编写的类访问数据库.你一直说tomcat连接数据库,这当然是无关的,因为tomcat本身和数据库是分离的,只是你的dao去访问了数据库.这点一定要搞清楚.之所以用listener会出现这个问题.原因就在于tomcat的启动过程.是listener最优先加载启动的.其次才……
[/Quote]

你的意思是因为使用listener的时候类还未加载的问题么,那么使用servlet的话不管延迟时间是多少都不会有影响了对吧?我一直以为是这个时候未连接到数据库,是因为我看控制台代码是报错在连接数据库服务之前。主要还是对tomcat加载服务这块理解的不够透彻。
caoyishuai 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不知道楼主用的是listener来监听启动还是用servlert的start-up来设置启动,
如果是listener监听启动会出现这种情况,用servlet的start-up的启动就不会了
[/Quote]

用的是listener的坚挺。。
suciver 2012-08-31
  • 打赏
  • 举报
回复
不知道楼主用的是listener来监听启动还是用servlert的start-up来设置启动,
如果是listener监听启动会出现这种情况,用servlet的start-up的启动就不会了
suciver 2012-08-31
  • 打赏
  • 举报
回复
什么叫加载数据库?你的项目是不是被spring管理,而你的问题是关于操作数据库的bean怕在servlet启动后,spring还没初始化完成吗?
caoyishuai 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不知道楼主用的是listener来监听启动还是用servlert的start-up来设置启动,
如果是listener监听启动会出现这种情况,用servlet的start-up的启动就不会了
[/Quote]
<servlet>
<servlet-name>timerServlet</servlet-name>
<servlet-class>com.cfcc.ServletTimer</servlet-class>
<init-param >
<param-name >startTask</param-name >
<param-value >true</param-value >
</init-param >
<init-param >
<param-name >intervalTime</param-name >
<param-value >1</param-value >
</init-param >
<!-- 配置应用启动时,创建Servlet实例 -->
<load-on-startup>100</load-on-startup>

</servlet>


你的意思是这样启动么?可是这样能保证在加载数据库之后了么?我因为是需要在启动这个定时器的时候就去访问数据库的。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧