请教高手:J2EE使用定时器和对象的缓存...

目前遇到几个问题,请教一下有经验的人:1,在java的J2EE应用开发中,怎么使用定时器,比如每隔5分钟,去扫描某个表,执行一个特定的操作。2,缓存,当某个操作失败的时候,怎么使用缓存,记得好像java里面可以把一个对象序列化为一个本地文件之类的,是不是有这种搞法,缓存之后,每隔一定的时间去进行某种操作,比如利用缓存的数据,调用一个web service之类...3,存储过程里面能直接返回一个类似于java里面的对象数组,类似结果集的东西吗
多谢多谢!这几个问题搞定,我就爽的很来噢,多谢

1> session bean好像有定时功能。也可以用java.util.Timer,虽然J2EE规范不赞成你自己创建线程

2> 看不懂

3> 看下CallrableStatement就知道了

关于你的第二点,我发表点看法
实现这个的方案比较多,例如保存为文件,序列化,保存到数据库等。
总之,能把对象的状态保存,然后能再取得即可。

我的解决方案比较特殊 供参考:
1. 在J2EE中不推荐定时扫描数据库,而是使用观察者模式、JMS等,当内存该状态发生变化时,通知执行某特定事件,这种方式可降低数据库的负载。既然用了中间件,就尽量分载,否则没有意义。

2. 缓存和操作失败是什么关系?上面就是基于缓存的。

3. 不推荐使用存储过程,违反可维护性、可拓展性,难于维护,只有编写存储过程的人知道其中诀窍,唯一优点是性能好,请问性能再快,也只能一台数据库服务器啊,如果访问量再上去,你用什么技术再提升呢?还是要回到可伸缩的分布式计算中间件的解决思路上。

借个地发表一个问题:我要实现一个站内消息系统
问题:甲给乙发了消息,乙的JSP界面如何知道有了新的消息并及时通知,数据定时刷新?观察者模式?

楼上的,先搞清楚B/S结构是什么,你要的功能用纯B/S是没有办法解决的。在浏览器那一层上,只能是请求触发而不能是消息触发。

一般都是定时刷新页面读取数据库。或者你用一个自动刷新的页面定时去读自己接受到的消息,这算是比较严谨的做法。或者给客户端按些小软件,功能好做,但是违背了B/S的初衷

有时候事情不是向想象的那样的,为了保护对原有系统的投入,不会因为要做新的应用,就把原来的东西全部换掉。对于异构系统的集成,经常会碰到这样的问题。所以在这个基础上,首先考虑的是问题来了搞不搞的定,其次才是如何能做得更好。不知道我的说法大家是否赞成。

1。java.util.Timer和java.util.TimerTask虽然功能上弱了点,但还是比较好用的两个工具类,能满足一般的应用。但要注意的是,如果时间间隔太短,而对某个表进行扫描,我觉得这样做是有问题的。比如,我每隔5秒钟要对N多通话记录(假如N的值比较大),进行计算话费,这时用Timer和TimerTask就会有问题了,因为每隔5秒它会开启一个新的线程,但是5秒前的线程可能并没有处理完所有的通话记录,这时就有可能会出现一条通话记录生成了多个话费的问题,哈哈,多收了用户的钱,这下麻烦了,小心人家告你,嘿嘿。。。

所以在用这两个类的时候一定要问一问,在我这个时间间隔中是否能处理完所有的数据?

2。通常缓存都是把数据或者对象暂时保存到内存的,我晕,你居然想到了对象序列化到文件,不知道文件IO很慢吗?与其这样还不如持久化到数据库呢!看你是否能将第一次创建的对象保存到静态的HashMap或ArrayList中。

3。“存储过程里面能直接返回一个类似于java里面的对象数组”。
哈哈,这个问题我原来就遇到过,说实话我也很讨厌这样做,但是没办法。我COPY一段代码给你吧,我不想做任何解释。

StringBuffer sb = new StringBuffer("{CALL sp_listschedule_local(?, ?, ?, ")
.append(" ?,?,?,?,?,?,?) }");
CallableStatement cstmt = conn.prepareCall(sb.toString());
int i = 1;
/*七个传入参数*/
cstmt.setString(i++, param.getRideDate());
cstmt.setString(i++, param.getIsDisCount());
cstmt.setString(i++, param.getStartStationId());
cstmt.setString(i++, param.getToStationId());
cstmt.setString(i++, param.getScheduleId());
cstmt.setInt(i++, param.getSellLimittedTime().intValue());
cstmt.setInt(i++, param.getSelfOrgId().intValue());
cstmt.setInt(i++, param.getIsBuPiao().intValue());
cstmt.setString(i++, param.getSqlStr());

/*一个输出参数*/
int[] retIndex = {i};
cstmt.registerOutParameter(i++, oracle.jdbc.driver.OracleTypes.CURSOR);
/*执行过程*/
cstmt.executeUpdate();


int j=0;
ResultSet rs = (ResultSet) cstmt.getObject(retIndex[j++]);
ListScheduleDto dto = ListScheduleRet.createNomalDtosFromResultSet(rs);
ListScheduleRet ret = new ListScheduleRet();
ret.setDto(dto);
cstmt.close();

借个地发表一个问题:我要实现一个站内消息系统
问题:甲给乙发了消息,乙的JSP界面如何知道有了新的消息并及时通知,数据定时刷新?观察者模式?

现在有一定的技术能够解决该类问题。
建议你研究一下Echo和jsf

存储过程的看法:
不能一刀切的否定存储过程。
使用存储过程要看情景:
如果操作用存储过程很省时间等等,为什么不用?
但不能滥用存储过程,一般涉及到性能等问题,才能考虑用。

存储过程不建议这样,如果需要如何实现,可参考我的Jdon框架结合缓存的优化。

编程如画国画,下笔要慎重,否则一个坏笔会破坏整个画面的构图,从此走向畸形,程序员要有:编码方向不能错,宁可不编码,没有设计好,胡乱下笔,会误导大批。

多谈问题,少谈主义!

定时器:你可以使用用操作系统的定时器触发你的java程序(就是一个普通的java程序),如unix底下的crontab,当然你可以选择部署在应用服务器所在的机器上。
缓存:不知道你的需求,至于序列化,java中实现了serializable接口就可以序列化,具体看api文档。

至于抛弃数据库的高论,我看了文章,不知道除了对象和模式以外(我只是说您所理解的高度),不知道你知不知道所有业务逻辑的建模都是有他的数学基础的,建议你去看看关系数学。如果您是说设计那算我没说了,新来的那些毕业生做了3天java都可以跟我口若悬河的谈设计的,呵呵。

>数据库是什么东西?只是对象持久化之一

哎。。。。无语

多谈问题,少谈主意!

定时器:你可以使用用操作系统的定时器触发你的java程序(就是一个普通的java程序),如unix底下的crontab,当然你可以选择部署在应用服务器所在的机器上。
缓存:不知道你的需求,至于序列化,java中实现了serializable接口就可以序列化,具体看api文档。

至于抛弃数据库的高论,我看了你的文章,不知道除了对象和模式以外(我只是说您所理解的高度),不知道你知不知道所有业务逻辑的建模都是有他的数学基础的,建议你去看看关系数学。如果您是说设计那算我没说了,新来的那些毕业生做了3天java都可以跟我口若悬河的谈设计的,呵呵。

〉数据库是什么东西?只是对象持久化之一

无语。。。

You can check JMX Time service. Use scheduler can do what you want

J2EE Timer 其利用 java.util.Timer 就可以得很好了
如果你想要比^}s的 Timer F
可以利用 Opensource 中的 Quartz or JCrontab

http://www.opensymphony.com/quartz/
http://jcrontab.sourceforge.net/index.shtml

都是不e的x, 不^我比^推] Quartz
都可以我的子笾胁榭椿臼褂玫馁Y料 ( http://www.sentom.net/list.asp?id=32 )

另外, Caching 的部分, 其 JCP 原本要定x相P的 Spec
http://www.jcp.org/en/jsr/detail?id=107
但是 2001 年之後tt]有幼, 自然在 Opensource 中也有各N作方式
例如 jCache..
http://jcache.sourceforge.net/

不^通常各 Application Server Vendor 都有相P的作
JBoss 的 Cache 也是不e
http://www.jboss.org/products/jbosscache
如果你研究一下 JBossCache 泻艽蟮Wc突破

然 jakarta commons 也有相P的 cache 作
http://jakarta.apache.org/commons/sandbox/cache/
不^F在在研l中, 已可以玩一玩了

如果要利用在 Hibernate 冉陀幸韵 libs,
OSCache ( http://www.opensymphony.com/oscache/ )
EHcache ( http://ehcache.sourceforge.net/ )
@篇文章得很完整, 可以⒖ ( http://forum.javaeye.com/viewtopic.php?t=6593&postdays=0&postorder=asc&start=0 )