最近在做一个项目的时候遇到一个这样的问题?
数据库的一个表中,有很多数据,这些数据又经常被读取。如果采用进入一个用户就打开一次,那么就会对表的损坏很大的影响。
要执行的功能如下:
每隔50分钟读取表的数据,并存放在servletContext()中(jsp的Application对象里)也就是加载到Servlet容器中,这样,用户访问的时候,读取的是服务器的内存数据,而不是从数据库中读取。
用struts2+spring2.0+hibernate3很容易就解决了读取数据的操作。通过struts2 的 getServletContext().setAttribut("abc",lst);很好就解决了。
第一种解决方法:请问:能不能在spring2任务调度中,每隔50钟执行一次。能的话,请问怎么解决?
第二种方法:采用java.unil.timer 的run()直接调用javax.servlet.servletContext 接口
但是总是报:java.lang.Nullexcption错。
------解决方案--------------------------------------------------------
用类似timer 的东西我觉得这里用不太好,timer一般不要用,我想你这里可能也还不需要用。
我说下我的想法,
对此表设一个版本号.
此版本号用Application对象存储,我们叫AppObj1.
每次启动的系统的使用,版本可定为1.0,比如AppObj1=1.0
然后
把数据读取到你定的另一个Application对象里,我们叫AppObj2,
比如 AppObj2=recordList.
AppObj2要补充一个属性,就是版本号,就是此时(启动)对应的AppObj1的值
然后系统在运行中
如果用户修改了表,就修改版本好。AppObj1=1.1
用户访问表的时候先对比AppObj2的版本号和AppObj1是不是相等,
如果不是就从取数据到AppObj2中并更新AppObj2的版本号为AppObj1。
仅供参考
------解决方案--------------------------------------------------------
ehcache框架
ehcache.xml
<!-- 视频服务器 -->
<cache name="VideoServer"
maxElementsInMemory="500"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="900"
timeToLiveSeconds="900"
memoryStoreEvictionPolicy="LRU">
</cache>
service类
public Map doGetServer_Cache(String serverID) {
CacheManager manager = CacheManager.getInstance();
Cache cache = manager.getCache("VideoServer");
Element ele = cache.get("VideoServer_cache"+serverID);
if(ele!=null){
return (Map)ele.getObjectValue();
}
Map server = videoServerDAO.findServerByID(serverID);
cache.put(new Element("VideoServer_cache"+serverID, server));
return server;
}
//大型网站使用,Hibernate内部也是使用这种缓冲技术
------解决方案--------------------------------------------------------
第一个问题,可以,spring有专门的定时执行功能,可以设置执行周期为50分钟
第二个问题,不推荐使用。
------解决方案--------------------------------------------------------
能不能在spring2任务调度中,每隔50钟执行一次。能的话,请问怎么解决?
spring2的调度的配置非常简单,随便看一下spring2的中文参考手册很快就能配置出来,
至于在quartz中获取ServletContext,这个更简单,只需要你的quartz所执行的业务类实现ServletContextAware,这样ServletContext 会被注入进来,你就可以进行相应的操作!